2014-07-19 4 views
0

créer un abonné et enregistrer un nouveau service, ce que je fais: https://gist.github.com/Draeli/2c591c16409a5664ae58Symfony2 doctrine de l'abonné d'appel et d'autres

<?php 
namespace My\BlogBundle\Listener; 

use Doctrine\ORM\Events; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 

class BlogArticleDetailListener implements EventSubscriberInterface 
{ 

    /** 
    * @var ContainerInterface 
    */ 
    protected $container; 

    public function __construct(ContainerInterface $container) 
    { 
     $this->container = $container; 
    } 

    static public function getSubscribedEvents() 
    { 
     return array(
      'doctrine.event_subscriber' => array(
       array(Events::prePersist, 0), 
       array(Events::preUpdate, 0), 
      ), 
     ); 
    } 

    public function prePersist(FilterResponseEvent $event) 
    { 
     var_dump('prePersist');die; 
    } 

    public function preUpdate(FilterResponseEvent $event) 
    { 
     var_dump('preUpdate');die; 
    } 
} 

services: 
    my_blog.listener.blog_article_detail: 
     class: My\BlogBundle\Listener\BlogArticleDetailListener 
     arguments: ["@service_container"] 
     tags: 
      - { name: kernel.event_subscriber } 

Mais ces méthodes de cas PrePersist et PreUpdate malgré je persiste des objets, comme si Doctrine n'a pas envoyé. Quelqu'un sait ce qui est fort dans ce que je fais?

(Pour plus d'explications, maintenant je vous inscrire seul événement de doctrine, mais après que j'enregistrerai plus de même endroit)

Répondre

1

service

À l'heure actuelle l'auditeur écoute à l'événement en cours d'expédition en utilisant l'événement du noyau Symfony répartiteur alors que vous devriez écouter le répartiteur d'événements Doctrine.

Votre service ...

services: 
    my_blog.listener.blog_article_detail: 
     class: My\BlogBundle\Listener\BlogArticleDetailListener 
     arguments: ["@service_container"] 
     tags: 
      - { name: kernel.event_subscriber } 

Il devrait y avoir la balise doctrine.event_subscriber plutôt que le noyau.

Abonné

Comme vous créez un abonné Doctrine plutôt que d'un abonné du noyau Symfony, vous devez mettre en œuvre \Doctrine\Common\EventSubscriber, ce qui signifie la méthode getSubscribedEvents ne doit pas être statique.

Actuellement, votre abonné est à l'écoute d'un événement appelé doctrine.event_subscriber plutôt que d'écouter les événements Doctrine.

Vous devriez vraiment être en train d'écouter les événements Doctrine utilisant ...

public function getSubscribedEvents() 
{ 
    return array(
     Events::prePersist, // I'm not sure about setting 
     Events::preUpdate,  // the priorities to be honest 
    ); 
} 

Avec les événements Doctrine vous ne serez pas obtenir FilterResponseEvent comme Doctrine envoie avec des objets d'arguments spécifiques (la plupart du temps Doctrine\Common\Persistence\Event\LifecycleEventArgs) sur les événements. Pour plus d'informations sur les arguments (et les événements), vous pouvez voir le documentation.

+0

C'était ma première approche et fonctionne mais cet auditeur est supposé être pour un genre d'objet et non seulement enregistrer l'événement de doctrine et quand j'essaye de modifier mon code tout l'automne :( – Draeli

+0

Je ne vous comprends pas. essayer de combiner la doctrine et les événements Symfony dans la même classe? – qooplmao

+0

J'essaie de faire quelque chose comme ça oui: http://symfony.com/doc/current/components/event_dispatcher/introduction.html#using-event-subscribers – Draeli

Questions connexes