2012-11-02 63 views
3

我已按照cookboock中的說明操作:http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html 但不幸的是我的EventListener沒有被調用。事件監聽器未註冊或在主旨事件上調用

service.yml

services: 
     strego.acl.eventlistener: 
     class: Strego\TippBundle\EventListener\AclUpdater 
     tags: 
      - { name: doctrine.event_listener, event: prePersist, connection: default } 

這裏是我的EventListener執行:

namespace Strego\TippBundle\EventListener; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class AclUpdater implements ContainerAwareInterface 
{ 

    protected $container; 


    public function prePersist(LifecycleEventArgs $args) { 
     $args->idonotexist(); // should crash if called 
     } 
    } 

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

現在我的控制器代碼,與我想測試一下:

public function testAction($id){ 
     $em = $this->getDoctrine()->getEntityManager(); 
     $entity = $em->getRepository('StregoTippBundle:BetGroup')->find($id); 
     $entity->setUpdatedAt(new \DateTime()); 
     $entity->setTitle('update Name! #2'); 
     $em->persist($entity); 
     $em->flush();   
     return new \Symfony\Component\HttpFoundation\Response("done"); 
    } 

我沒有Idae爲什麼我的prePersist行動沒有​​被調用。有沒有人看到我的代碼的問題?

回答

4

prePersist在您首次保存實體時被調用。在控制器中,您正在更新現有的。

preUpdate並嘗試或在控制器從編輯更改爲創建新的實體。你可能不需要連接:config.yml中的默認值。

+0

感謝您的幫助,在DoctrineFixture加載過程中事件是如何觸發的?即使監聽器已註冊,監聽器也不會被觸發。 – m0c

+0

我不確定我是否理解,只是爲了澄清;你說DoctrineFixtures不會觸發prePersist()偵聽器?老實說,我不知道爲什麼會發生這種情況,但我很久沒有使用它了。我忘記了原因,但也許這是其中之一。建議:如果它不正確,請不要使用它。我所有的測試類都擴展了我自己的TestCase,然後擴展了Phpunit。在那個中產階級中,我使用了常規的$ em-> persist($ entity)的fixture,並且觸發了所有的監聽器。 – Zeljko

+0

準確地說,在Doctrinefixtures中,我的偵聽器沒有被觸發。所以你使用測試類來加載燈具?我寧願仍然使用Doctrinefixtures,因爲我目前擁有像引用那樣構建的所有燈具。 – m0c