Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Créer ses entités avec Symfony 2

Article posté le 29-08-2014 dans la catégorie PHP

La suite de nos petits tutos Symfony 2. Aujourd'hui, la création de vos entités. Pour rappel, les entités ne sont ni plus ni moins que des objets que vous manipulez. Tout étant POO dans ce framework, vous devez maîtriser ces éléments.

Dans beaucoup de solutions vous devez créer vos entités manuellement, pas avec Symfony qui vous génère le code automatiquement, si vous le souhaitez. Ces entités sont créées au format Doctrine 2, l'ORM du framework. Dans un autre tuto, nous verrons comment manipuler ces entités avec Doctrine.

Bien assez parlé, soit notre entité :

Nom de l'entité : Vidéo

Rappel : quand vous faites des modifications, et que vous n'avez pas le résultat attendu, pensez à vider le cache. Pour cela, tapez dans la console :

php app/console cache:clear

 

1- Les fichiers

Nous allons la créer via le générateur de Symfony. Lancer une console, placez vos à la racine de votre projet, et tapez ceci :

php app/console generate:doctrine:entity

On vous demande tout d'abord le nom de l'entité. Il faut la taper sous ce format : 

NomBundle:NomEntité

On vous demande ensuite le format de l'entité. Laissez celui par défaut : celui des annotations, en validant directement avec la touche Entrée.

Passons maintenant aux champs :

Quelque chose d'important, le champ Id est automatiquement créé par Doctrine. Donc ne devont que nous occuper des autres champs.

Tout d'abord saisir le nom du champ, validez, puis le type, validez.

Voici les diffférents types existant dans la doc officielle de Doctrine (Point 5.4) :

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifier-generation-strategies

Quand vous avez fini, c'est à dire plus de champ à saisir, appuyez sur Entrée. On vous demande ensuite si vous voulez créer le repository, tapez yes. Confirmez encore. Voilà, allez voir le répertoire Entities de votre bundle, vous verrez deux nouveaux fichiers.

Quelques explications importantes.

L'entité fait partie de la couche métier de votre application, là où tous vos calculs se font. Pensez donc à créer dans votre entité toutes les méthodes nécessaires afin qu'elles soient réutilisables, c'est à dire à ne pas tout refaire dans votre contrôleur à chaque fois. Par exemple pour une entité facture, prévoir une méthode CalculMontantTotal() afin d'évitez de tout recalculer à chaque fois dans le contrôleur en additionant chaque élément de la facture. De plus, n'oubliez pas que vous devez ici penser en mode objet, et non en base de données. Le but de l'ORM étant de faire abstraction le plus possible de la BDD!

Edit de 2016: les choses ont fondamentalement changé depuis. Prévoir une classe modèle qui gère les opérations liées à chaque type d'entité, ces dernières ne devant être que des classes reflétant les données qu'elles représentent et ne contenir rien d'autre.

Important : Il arrive parfois que dans votre entité, le nom de la table soit absent des commentaires. Je ne sais pas pourquoi (bien que je pense avoir à la réponse), mais en local cela ne pose pas de problème. En ligne par contre... Il faut donc, si vous avez le problème,  vérifier que le nom de votre table apparaisse sous cette forme :

@ORMTable(name="video")

Au départ, il n'y avait rien entre les parenthèses. Pensez aussi à respecter la casse pour le nom des tables!

2- Dans la base de données

A présent il faut concrétiser tout cela dans votre base de données. Doctrine s'occupe de tout, vous n'avez pas à tripatouiller dans phpMyAdmin. Voici que vous devez savoir

Rappel : en cas de problème de connexion, vérifiez vos paramètres dans le fichier :

app/config/parameters.yml

A- Création de la base

Dans la console, tapez :

php app/console doctrine:database:create

Votre base a été créée.

B- Création des tables

En préalable, cette commande :

php app/console doctrine:schema:update --dump-sql

vous permet d'afficher la requête SQL : elle vous permet de vérifier que tout est ok par rapport à ce que vous attendez. Mais sinon, elle ne vous sert à rien d'autre que vérifier votre travail.

Pour créer la table pour de bon, voici la commande :

php app/console doctrine:schema:update --force

Votre table a été créée.

C- Modifications

Et maintenant, si vous voulez modifier vos entités? Très simple!

Tout d'abord modifiez votre fichier, celui de votre entité. Entendez par là, uniquement les attributs et méthodes de classe, pas les annotations.

Ensuite, dans la console, tapez :

php app/console doctrine:generate:entities MonBundle:MonEntite

va mettre à jour le mapping (les annotations) dans votre entité.

Et ensuite, cette commande :

php app/console doctrine:schema:update --dump-sql

pour vérifier que tout est ok. Si c'est le cas, on met à jour la table :

php app/console doctrine:schema:update --force

Et voilà!

3- Manipulations

Maintenant, imaginons que vous vouliez enregistrer vos entités dans la base de données. Oubliez les requêtes SQL!

Tout d'abord, dans votre contrôleur, il vous faut charger le service Doctrine :

$doctrine = $this->get('doctrine');

ou

$doctrine = $this->getDoctrine();

Il va nous servir à :

A présent, au travail!

Vous devez comprendre deux choses : nous allons maintenant charger deux éléments:

Avec ces commandes :

$em = $this->getDoctrine()->getManager(); //Doctrine Manager

et

$repository_video = $em->getRepository('MonSiteBundle:Video'); // Repository

Petit exemple pour l'écriture :

use MonNameSpaceSiteBundleEntityVideo;
...
// Etape 1 : Gestion des éléments nécessaires
        $em = $this->getDoctrine()->getManager();
           
        // Etape 2 : Création d'une entité
        $laVideo = new Video();
        $laVideo->setNom("Gd-Pa Simpson MDR");
        $laVideo->setNomFichier("gpSimpsonMDR.avi");
        
        //Etape  3 : persistance des données et écriture 
        $em->persist($laVideo);
        $em->flush();

Les deux dernières lignes servent à :

De plus retenez une chose importante, il ne sert à rien de faire un persist si l'entité a été chargée par Doctrine. En effet, si vous créez une entité, forcément vous devez la lui confier. Par contre, si vous en chargez une depuis la base, c'est inutile puisque c'est déja Doctrine qui s'en est occupé! Exemple avec une lecture :

// Etape 1 : Gestion des éléments nécessaires
        $em = $this->getDoctrine()->getManager();
        $repository_video = $em->getRepository('MonSiteBundle:Video');
        // Etape 2 : Récuperer une entité
        $laVideo = $repository_video->find(1);

Voici quelques autres commandes que vous devez connaître pour le manager de Doctrine :

4- Evènements

Enfin, juste un petit mot sur une notion qui pourrait vous servir : les évènements Doctrine, ou callback. Il s'agit ni plus ni moins de traitement à effectuer de manière systématique dans votre entité, à certain moment de son cycle de vie, par exemple effectuer un calcul après que l'entité ait été lue dans la bdd... On utilise pour ces réglages les annotations bien évidemment.


Tweet
comments powered by Disqus