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 :
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}
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
Utilisation des transformers
Démarrer le manager TransformersManager depuis le fichier app/config/services.php :
\Ubiquity\contents\transformation\TransformersManager::startProd();
Le résultat peut être testé depuis l’interface d’administration :
ou en créant un contrôleur
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>
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 :
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
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();
Smith user name will be displayed as smith@mydomain.local.