Transformers

Note

Le module Transformers utilise la classe statique TransformersManager pour gérer les transformations.

Les Transformers sont utilisés pour transformer les données après leur chargement depuis une base de données, ou avant leur affichage dans une vue.

Ajouter des transformers

Soit la classe Author que nous souhaitons utiliser dans notre application :

app/models/Author.php
 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}

Un transformer a été ajouté sur le membre name avec l’annotation @transformer , de façon à mettre en majuscules le nom dans les vues.

Génération du cache

Exécuter la commande suivante dans la console pour générer le cache de la classe Author :

Ubiquity init-cache -t=models

Le cache des transformers est généré avec les méta-données des models dans le dossier app/cache/models/Author.cache.php.

Les informations relatives aux transormers peuvent être affichées à partir des devtools :

Ubiquity info:model -m=Author -f=#transformers
../_images/trans-info.png

Utilisation des transformers

Démarrer le manager TransformersManager depuis le fichier app/config/services.php :

app/config/services.php
\Ubiquity\contents\transformation\TransformersManager::startProd();

Le résultat peut être testé depuis l’interface d’administration :

../_images/trans-upper.png

ou en créant un contrôleur

app/controllers/Authors.php
 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}
app/views/Authors/index.html
<ul>
   {% for author in authors %}
      <li>{{ author.name }}</li>
   {% endfor %}
</ul>

Types de transformers

transform

Le type transform est basé sur l’interface TransformerInterface. Il est utilisé lorsque les données doivent être transformées en objet.
Le transormer DateTime est un bon exemple d’un tel transformer :

  • Au chargement des données, le transformer convertit les données de la base en une instance de php DateTime.

  • La méthode reverse effectue l’opération inverse ( php date vers date compatible avec la base de données).

toView

Le type toView est basé sur l’interface TransformerViewInterface. Il est utilisé dans le cas où les données transformées doivent être affichées dans une vue.

toForm

Le type toForm est basé sur l’interface TransformerFormInterface. Il est utilisé lorsque les données doivent être affichées dans un formulaire.

Utilisation des transformers

Transformation sur chargement des données

En cas d’omission, l’opération par défaut transformerOp est transform

$authors=DAO::getAll(Author::class);

Définit transformerOp à toView

DAO::transformersOp='toView';
$authors=DAO::getAll(Author::class);

Transformation après chargement

Retourne la valeur du membre transformée

TransformersManager::transform($author, 'name','toView');

Retourne une valeur transformée :

TransformersManager::applyTransformer($author, 'name','john doe','toView');

Transforme une instance en lui appliquant tous les transformers définis :

TransformersManager::transformInstance($author,'toView');

Transformers existants

Transformer

Type(s)

Description

datetime

transform, toView, toForm

Transforme une date issue de la base de données en une instance de DateTime php

upper

toView

Met la valeur du membre en majuscule

lower

toView

Met la valeur du membre en minuscule

firstUpper

toView

Met une majuscule sur la première lettre de la valeur du membre

password

toView

Masque les caractères de la valeur du membre

md5

toView

Hash la valeur en md5

Créer votre propre transformer

Création

Crée un transformer pour afficher un nom d’utilisateur comme une adresse email locale :

app/transformers/toLocalEmail.php
 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}

Enregistrement

Enregistrer le transformer en exécutant le script suivant :

TransformersManager::registerClassAndSave('localEmail',\transformers\ToLocalEmail::class);

Utilisation

app/models/User.php
 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}
DAO::transformersOp='toView';
$user=DAO::getOne(User::class,"name='Smith'");
echo $user->getName();

Smith user name will be displayed as smith@mydomain.local.