2011-06-07 98 views

回答

10

首先,註冊一個服務作爲一種學說事件偵聽器:

app/config.yml

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

然後在您的監聽器類,定義一個onPostPersist方法(或任何你命名的配置的方法)需要Doctrine\ORM\Event\LifecycleEventArgs參數:

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

請注意,你不能EntityManager實例傳遞給listene r類,因爲$ eventArgs包含對它的引用,這樣做會拋出CircularReferenceException。

學說項目文檔here。 Symfony項目文檔here(過時,但僅供參考)/

+0

我正在做這個完全相同的事情,但我試圖在我的偵聽器中包含對securityContext對象的引用。我在我的yml文件中添加了:arguments:[「@ security.context」],但是當我將$ securityContext對象添加到我的構造函數中時,出現循環引用錯誤。有任何想法嗎?我正在使用FOSUserBundle,並在我收到的錯誤中顯示。 – Jeremy 2011-09-26 19:35:09

+1

這是我收到的錯誤。 ServiceCircularReferenceException:檢測到服務「security.context」的循環引用,路徑:「profiler_listener - > profiler - > security.context - > security.authentication.manager - > fos_user.user_manager - > doctrine.orm.default_entity_manager - > doctrine.dbal。 default_connection - > my.listener「。 – Jeremy 2011-09-26 19:35:55

1

嘗試注入容器本身而不是安全上下文。使用FOS_USER,security.context依賴於您的偵聽器(EM),您的偵聽器需要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> 

順便說一句,至少在XML,方法名似乎並不奏效,默認情況下它調用的方法「postPersist」代替,而忽略你給任何方法的名稱(fooMethod);請讓我知道,如果這是YAML配置的情況,或者我錯了。