Propriétés conviviales d'entité

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche
Ligne 21 : Ligne 21 :
  
 
== Mise en oeuvre ==
 
== Mise en oeuvre ==
 +
La mise en oeuvre se déroulera en 5 étapes :
 +
*Création d'une classe d'annotation
 +
*Ajout d'informations dans l'entité
 +
*Création d'une fonction globale
 +
*Modification du contrôleur
 +
*Modification de la vue
 +
 +
=== Création d'une classe d'annotation ===
 +
Les annotations PHP est un projet porté par Doctrine. La documentation officielle est accessible à l'URL : https://www.doctrine-project.org/projects/doctrine-annotations/en/1.6/index.html
 +
 +
En ce qui concerne cette mise en oeuvre, il suffira de s'inspirer de la [https://www.doctrine-project.org/projects/doctrine-annotations/en/1.6/custom.html documentation sur la création de classe d'annotations personnalisée].
 +
 +
Ce qui donne, par exemple, la classe suivante :
 +
<syntaxhighlight lang="php">
 +
<?php
 +
// src/Annotations/FriendlyAnnotation.php
 +
namespace App\Annotations;
 +
 +
/**
 +
* @Annotation
 +
*/
 +
class FriendlyAnnotation
 +
{
 +
    public $friendlyName;
 +
}
 +
</syntaxhighlight>
 +
 +
=== Ajout d'informations dans l'entité ===
 +
L'annotation personnalisée étant créée, il est alors possible de renseigner des champs personnalisés dans les entités.
 +
 +
Plus particulièrement, pour avoir un nom convivial pour chaque propriété, il est possible de faire ceci :
 +
<syntaxhighlight lang="php" highlight="14,22,28,34,40,46,52">
 +
<?php
 +
// src/Entity/Application.php
 +
namespace App\Entity;
 +
 +
use Doctrine\ORM\Mapping as ORM;
 +
use App\Annotations\FriendlyAnnotation;
 +
 +
/**
 +
* @ORM\Entity(repositoryClass="App\Repository\ApplicationRepository")
 +
*/
 +
class Application
 +
{
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Id")
 +
    * @ORM\Id()
 +
    * @ORM\GeneratedValue()
 +
    * @ORM\Column(type="integer", options={"comment":"Id"})
 +
    */
 +
    private $id;
 +
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Nom")
 +
    * @ORM\Column(type="string", length=255, options={"comment":"Nom"})
 +
    */
 +
    private $name;
 +
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Alias")
 +
    * @ORM\Column(type="string", length=255, options={"comment":"Alias"})
 +
    */
 +
    private $alias;
 +
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Responsable MOE")
 +
    * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Responsable MOE"})
 +
    */
 +
    private $applicationManager;
 +
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Responsable MOA")
 +
    * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Responsable MOA"})
 +
    */
 +
    private $businessManager;
 +
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Société")
 +
    * @ORM\Column(type="string", length=255, options={"comment":"Société"})
 +
    */
 +
    private $company;
 +
 +
    /**
 +
    * @FriendlyAnnotation(friendlyName="Description")
 +
    * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Description"})
 +
    */
 +
    private $description;
 +
 +
// et le reste des getters et setters ci-dessous ...
 +
}
 +
</syntaxhighlight>
 +
 +
=== Création d'une fonction globale ===
 +
=== Modification du contrôleur ===
 +
=== Modification de la vue ===

Version du 26 février 2020 à 17:22

Présentation

Cette page a pour objet de décrire comment définir un nom convivial d'une propriété d'une entité et de comment la récupérer dans Symfony.

Contexte

Dans le cadre de la mise en place d'un simple CRUD sous Symfony, il peut être nécessaire de pouvoir lister dans un tableau un ensemble d'entités. Ce tableau devra donc comporter des titres de colonnes. Idéalement, ces titres doivent correspondre à la description de la propriété de l'entité.

Par exemple, une propriété pourrait se nommer $teamLeader, mais la description de cette propriété correspondrait à Chef d'équipe. Les propriétés des entités étant des variables PHP, il n'est pas possible de leur donner un nom convivial tel quel.

De ce fait, où renseigner cette information ?

Plusieurs choix sont possibles :

  • Dans la définition ORM de l'entité, en annotation, avec la syntaxe * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Chef d'équipe"}) par exemple
    • Cette astuce permettra d'assigner un commentaire descriptif à la colonne en base de données. Toutefois, la récupération de cette information est laborieuse et il sera préférable de mettre en oeuvre d'autres solutions.
  • Dans une table supplémentaire dédiée à la description de chacune des propriétés de chaque entité.
    • Cette solution est envisageable, mais demande une maintenance particulière. De plus, l’algorithme de l'application devra tenir compte de cette architecture.
  • Dans chacune des vues ou contrôleurs qui auront besoin de cette information.
    • Le problème majeur de cette solution est la duplication de code. L'information sera présente à chaque endroit où elle sera nécessaire
  • Dans la définition de l'entité même
    • Cela rejoint à peu près la solution de l'ORM, et c'est cette solution qui va être détaillée dans cette page
  • Et d'autres solutions...

Mise en oeuvre

La mise en oeuvre se déroulera en 5 étapes :

  • Création d'une classe d'annotation
  • Ajout d'informations dans l'entité
  • Création d'une fonction globale
  • Modification du contrôleur
  • Modification de la vue

Création d'une classe d'annotation

Les annotations PHP est un projet porté par Doctrine. La documentation officielle est accessible à l'URL : https://www.doctrine-project.org/projects/doctrine-annotations/en/1.6/index.html

En ce qui concerne cette mise en oeuvre, il suffira de s'inspirer de la documentation sur la création de classe d'annotations personnalisée.

Ce qui donne, par exemple, la classe suivante :

<?php
// src/Annotations/FriendlyAnnotation.php
namespace App\Annotations;

/**
 * @Annotation
 */
class FriendlyAnnotation
{
    public $friendlyName;
}

Ajout d'informations dans l'entité

L'annotation personnalisée étant créée, il est alors possible de renseigner des champs personnalisés dans les entités.

Plus particulièrement, pour avoir un nom convivial pour chaque propriété, il est possible de faire ceci :

<?php
// src/Entity/Application.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use App\Annotations\FriendlyAnnotation;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ApplicationRepository")
 */
class Application
{
    /**
     * @FriendlyAnnotation(friendlyName="Id")
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", options={"comment":"Id"})
     */
    private $id;

    /**
     * @FriendlyAnnotation(friendlyName="Nom")
     * @ORM\Column(type="string", length=255, options={"comment":"Nom"})
     */
    private $name;

    /**
     * @FriendlyAnnotation(friendlyName="Alias")
     * @ORM\Column(type="string", length=255, options={"comment":"Alias"})
     */
    private $alias;

    /**
     * @FriendlyAnnotation(friendlyName="Responsable MOE")
     * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Responsable MOE"})
     */
    private $applicationManager;

    /**
     * @FriendlyAnnotation(friendlyName="Responsable MOA")
     * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Responsable MOA"})
     */
    private $businessManager;

    /**
     * @FriendlyAnnotation(friendlyName="Société")
     * @ORM\Column(type="string", length=255, options={"comment":"Société"})
     */
    private $company;

    /**
     * @FriendlyAnnotation(friendlyName="Description")
     * @ORM\Column(type="string", length=255, nullable=true, options={"comment":"Description"})
     */
    private $description;

// et le reste des getters et setters ci-dessous ...
}

Création d'une fonction globale

Modification du contrôleur

Modification de la vue