Installer les Behaviors Doctrine2 sous Symfony2

Symfony2 logo

Voici un exemple sur comment implémenter les Behaviors via l’EventListener de Doctrine2 dans Symfony2. Dans cet exemple, nous allons mettre en place le Behavior Timestampable sur un objet Entity du model.

Récupérer les extensions de Doctrine2

Placez vous dans le dossier /vendor de votre projet Symfony

$ cd vendor

Cloner le repository git des extensions doctrine

git clone https://github.com/l3pp4rd/DoctrineExtensions.git doctrine-extensions

Vous devez avoir maintenant le dossier suivant /vendor/doctrine-extensions.

Paramétrer l’autoloader pour charger les extensions Doctrine2

Editer le fichier /app/autoload.php, et ajouter les lignes suivantes

<?php

use Symfony\Component\ClassLoader\UniversalClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    ...
    'Gedmo'            => __DIR__.'/../vendor/doctrine-extensions/lib',
    ...
));
...
$loader->register();

Utiliser les annotations pour définir les champs Timestampable dans votre Entity

Dans l’exemple suivant, nous allons ajouter les champs created_at et updated_at à l’objet Product.

<?php
namespace ...\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
...

class Product
{
    ...

    /**
     * @var datetime $created_at
     *
     * @ORM\Column(name="created_at", type="datetime")
     * @Gedmo\Timestampable(on="create")
     */
    protected $created_at;

    /**
     * @var datetime $updated_at
     *
     * @ORM\Column(name="updated_at", type="datetime")
     * @Gedmo\Timestampable(on="update")
     */
    protected $updated_at;

    ...
}

Ajouter le listener

Il faut maintenant ajouter le listener pour effectuer la mise à jour des champs created_at lors de la création, et updated_at lors de la mise à jour, et ceci automatiquement lorsque l’Entity est persisté.

Editer votre class Bundle et ajouter ou mettre à jour la fonction boot()

public function boot()
{
    $em = $this->container->get('doctrine.orm.entity_manager');
    $evm = $em->getEventManager();
    // Timestampable
    $evm->addEventSubscriber(new \Gedmo\Timestampable\TimestampableListener());
}

Voici des liens pour plus d’information sur les extensions de Doctrine2 :

http://symfony.com/doc/2.0/cookbook/doctrine/common_extensions.html
http://www.doctrine-project.org/blog/doctrine2-behavioral-extensions

Ici vous trouverez un lien vers un Bundle pour les Doctrine Extensions:
https://github.com/stof/StofDoctrineExtensionsBundle

2 commentaires pour "Installer les Behaviors Doctrine2 sous Symfony2"

  • Par cmdr

    le 29/12/2011 @ 12:38

    Bonjour

    J’ai essayé de configurer le behaviour tree de cette manière

    ($evm->addEventSubscriber(new \Gedmo\Tree\TreeListener())).

    J’obtiens l’erreur suivante :

    Notice: Undefined index: nleft in C:\...\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadata.php line 90

    Une exception de type ErrorException est lancé et plus rien ne marche. As tu une idée de l’origine du problème ?

    Cordialement

  • Par Gabriel BONDAZ

    le 30/12/2011 @ 11:31

    Bonjour As tu bien défini les champs dont à besoin le behavior pour fonctionner sur la classe (entity) ?

    exemple avec ici « CLASS_NAME » à remplacer par le nom de la classe sur laquelle tu souhaite mettre en place le behavior doctrine:

    /**
     * @gedmo:Tree(type="nested")
     * @Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
     */
    class CLASS_NAME
    {
        ...
    
        /**
         * @gedmo:TreeLeft
         * @Column(name="tree_left", type="integer")
         */
        private $tree_left;
    
        /**
         * @gedmo:TreeLevel
         * @Column(name="tree_level", type="integer")
         */
        private $tree_level;
    
        /**
         * @gedmo:TreeRight
         * @Column(name="tree_right", type="integer")
         */
        private $tree_right;
    
        /**
         * @gedmo:TreeRoot
         * @Column(name="tree_root", type="integer")
         */
        private $tree_root;
    
        /**
         * @gedmo:TreeParent
         * @ManyToOne(targetEntity="CLASS_NAME", inversedBy="children")
         */
        private $tree_parent;
    
        ...
    }
    

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*