2011-06-07 3 views

Répondre

10

D'abord, inscrivez-vous un service comme un écouteur d'événement Doctrine:

app/config.yml:

services: 
    foo.listener: 
     class: Vendor\FooBundle\BarClass 
     tags: 
      - { name: doctrine.event_listener, event: postPersist, method: onPostPersist } 

Ensuite, dans votre classe d'auditeur, définir une méthode onPostPersist (ou nom que vous avez la méthode dans la configuration) que prend un argument Doctrine\ORM\Event\LifecycleEventArgs:

public function onPostPersist(LifecycleEventArgs $eventArgs) 
{ 
    // do stuff with the entity here 
} 

Notez que vous ne pouvez pas passer une instance de EntityManager à la listene r class, car $ eventArgs contient une référence à celui-ci, ce qui entraînera une exception CircularReferenceException.

Doctrine Documentation du projet here. Documentation du projet Symfony here (périmé, mais inclus à titre de référence)/

+0

Je fais exactement la même chose, mais j'essaie d'inclure une référence à l'objet securityContext dans mon écouteur. J'ai ajouté: arguments: ["@ security.context"] à mon fichier yml mais quand j'ajoute l'objet $ securityContext dans mon constructeur, j'obtiens une erreur circulaire de ref. Des idées? J'utilise le FOSUserBundle et cela se voit dans l'erreur que je reçois. – Jeremy

+1

Voici l'erreur que je reçois. ServiceCircularReferenceException: référence circulaire détectée pour le service "security.context", chemin: "profiler_listener -> profileur -> security.context -> security.authentication.manager -> fos_user.user_manager -> doctrine.orm.default_entity_manager -> doctrine.dbal. default_connection -> my.listener ". – Jeremy

1

Essayez d'injecter le conteneur lui-même au lieu du contexte de sécurité. avec FOS_USER, security.context dépend de votre écouteur (EM) et votre écouteur nécessite security.context.

<service id="foo.listener" class="%foo.listener.class%"> 
    <argument type="service" id="service_container"/> 
    <tag name="doctrine.event_listener" event="postPersist" method="fooMethod" /> 
</service> 

Par ailleurs, au moins en XML, le nom de la méthode ne semble pas fonctionner, par défaut, il appelle la méthode « postPersist » au lieu et ignorer quel que soit le nom que vous donnez méthode (fooMethod); S'il vous plaît laissez-moi savoir si c'est le cas avec la config YAML, aussi, ou je me trompe.