Transformers
Nota
El módulo Transformers utiliza la clase estática TransformersManager para gestionar las transformaciones de datos.
Los transformers se utilizan para transformar los datos después de cargarlos desde la base de datos o antes de mostrarlos en una vista.
Añadir transformers
O bien la clase Author que queremos utilizar en nuestra aplicación :
1namespace models;
2
3use Ubiquity\attributes\items\Transformer;
4
5class Author {
6
7 #[Transformer('upper')]
8 private $name;
9
10 public function getName(){
11 return $this->name;
12 }
13
14 public function setName($name){
15 $this->name=$name;
16 }
17}
1namespace models;
2
3class Author {
4 /**
5 * @var string
6 * @transformer("upper")
7 */
8 private $name;
9
10 public function getName(){
11 return $this->name;
12 }
13
14 public function setName($name){
15 $this->name=$name;
16 }
17}
Añadimos un transformer en el miembro name con la anotación @transformer, para poner el nombre en mayúsculas en las vistas.
Generar caché
Ejecute este comando en modo consola para crear los datos de caché de la clase Author :
Ubiquity init-cache -t=models
La caché del transformer se genera con metadatos del modelo en app/cache/models/Author.cache.php
.
La información de los transformers puede visualizarse con devtools :
Ubiquity info:model -m=Author -f=#transformers
Uso de transformers
Inicie el TransformersManager en el archivo app/config/services.php:
\Ubiquity\contents\transformation\TransformersManager::startProd();
Puede comprobar el resultado en la interfaz de administración:
o creando un controlador:
1namespace controllers;
2
3class Authors {
4
5 public function index(){
6 DAO::transformersOp='toView';
7 $authors=DAO::getAll(Author::class);
8 $this->loadDefaultView(['authors'=>$authors]);
9 }
10
11}
<ul>
{% for author in authors %}
<li>{{ author.name }}</li>
{% endfor %}
</ul>
Tipos de transformers
transform
El tipo transform se basa en la interfaz TransformerInterface. Se utiliza cuando los datos transformados deben convertirse en un objeto. |brl El transformador DateTime es un buen ejemplo de este tipo de transformador:
Al cargar los datos, el Transformador convierte la fecha de la base de datos en una instancia de php DateTime.
Su método reverse realiza la operación inversa (fecha php a fecha compatible con la base de datos).
toView
El tipo toView se basa en la interfaz TransformerViewInterface. Se utiliza cuando los datos transformados deben mostrarse en una vista.
toForm
El tipo toForm se basa en la interfaz TransformerFormInterface. Se utiliza cuando los datos transformados deben utilizarse en un formulario.
Uso de transformers
Transformación en la carga de datos
Si se omite, transformerOp por defecto es transform.
$authors=DAO::getAll(Author::class);
Establecer transformerOp a toView
DAO::transformersOp='toView';
$authors=DAO::getAll(Author::class);
Transformación tras la carga
Devuelve el valor transformado del miembro:
TransformersManager::transform($author, 'name','toView');
Devuelve un valor transformado:
TransformersManager::applyTransformer($author, 'name','john doe','toView');
Transforma una instancia aplicando todos los transformers definidos:
TransformersManager::transformInstance($author,'toView');
Transformers existentes
Transformer |
Tipo(s) |
Descripción |
datetime |
transform, toView, toForm |
Transformar una fecha y hora de una base de datos en un objeto DateTime de php |
upper |
toView |
Poner el valor en mayúsculas |
lower |
toView |
Poner el valor en minúsculas |
firstUpper |
toView |
Poner en mayúsculas el primer carácter del valor |
password |
toView |
Enmascarar los caracteres |
md5 |
toView |
Hashear el valor con md5 |
Cree personalizado
Creación
Crear un transformador para mostrar un nombre de usuario como una dirección de correo electrónico local:
1namespace transformers;
2use Ubiquity\contents\transformation\TransformerViewInterface;
3
4class ToLocalEmail implements TransformerViewInterface{
5
6 public static function toView($value) {
7 if($value!=null) {
8 return sprintf('%s@mydomain.local',strtolower($value));
9 }
10 }
11
12}
Registro
Registre el transformador ejecutando el siguiente script:
TransformersManager::registerClassAndSave('localEmail',\transformers\ToLocalEmail::class);
Uso
1namespace models;
2
3use Ubiquity\attributes\items\Transformer;
4
5class User {
6
7 #[Transformer('localEmail')]
8 private $name;
9
10 public function getName(){
11 return $this->name;
12 }
13
14 public function setName($name){
15 $this->name=$name;
16 }
17}
1namespace models;
2
3class User {
4 /**
5 * @var string
6 * @transformer("localEmail")
7 */
8 private $name;
9
10 public function getName(){
11 return $this->name;
12 }
13
14 public function setName($name){
15 $this->name=$name;
16 }
17}
DAO::transformersOp='toView';
$user=DAO::getOne(User::class,"name='Smith'");
echo $user->getName();
El nombre de usuario Smith aparecerá como smith@mydomain.local.