2017-04-06 88 views
0

我已經爲教義的postPersist,PostUpdate和postRemove方法創建了一個事件監聽器類。Symfony2在教義事件監聽器中獲取登錄用戶

我需要登錄的用戶ID在我的課,我都試過注射@security.context@security.token_storage@session 我得到了循環引用錯誤,即使我已經試過注射@service_container和使用container->get()我得到了同樣的循環引用錯誤。

ServiceCircularReferenceException:爲>服務 「doctrine.orm.default_entity_manager」 檢測的循環引用

我在serviec.yml代碼的代碼是這樣

my.listener: 
    class: \projectCreateEventListener 
    arguments: ["@service_container"] 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 
     - { name: doctrine.event_listener, event: postUpdate } 
     - { name: doctrine.event_listener, event: postRemove } 

我的事件監聽器類就像

class myListener 
    { 
     private $container; 

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

     public function prePersist(LifeCycleEventArgs $args) 
     { 
     $entity = $args->getEntity(); 

     //Circular reference error 
     $user = $this->container->get('security.context')- 
     >getToken()->getUser(); 

     //getToken() is always null 

     //Circular reference error 
     $user = $this->container->get('security.token_storage')- 
     >getToken()->getUser(); 

     //getToken() is always null 

     //Circular reference error 
     $userId = $this->container->get('auth.user')- 
     >getIdentity()['id']; 
     } 
    } 

儘管我正在登錄我的代碼中的用戶信息在$this->persist()之前$this->container->get('auth.user')->getIdentity()['id'];

+0

[在Doctrine EventListener中獲取用戶]的可能重複(http://stackoverflow.com/questions/40087840/get-user-in-a-doctrine-eventlistener) – LBA

+0

那麼,您使用什麼版本的Symfony,因爲安全性.context早就消失了。我懷疑你還有其他的事情發生。將一個教義聽衆直接綁定到Symfony可能是最好的方法。考慮使用Symfony事件分派器來處理這類事情。 – Cerad

回答

0

這是一個棘手的問題。在創建教義服務時,偵聽器在構建時被連接。如果您正在嘗試構建的偵聽器使用另一種服務(或其他某種服務),那麼需要以任何方式使用教義,才能獲得循環引用。

但是你可以圍繞它建立。

  1. 注射進入此事件監聽器
  2. 創建自定義事件(或多個)http://symfony.com/doc/current/components/event_dispatcher.html#creating-and-dispatching-an-event
  3. 調度事件在prePersist,postPersists方法。
  4. 構建另一個訂閱您的自定義事件並處理您的邏輯的偵聽器。

這實現了什麼:您的自定義事件偵聽器只會在您的自定義事件被實際觸發時初始化。在這一點上,像教義這樣的關鍵服務已經啓動並運行,並且避免了循環引用問題。

在我的項目中有類似的問題,並以這種方式解決它。不確定它是否是最優雅的方式,但它確實有效。 (如果有人有更好的解決方案,我也歡迎它)。

+0

你有沒有看到我的評論註冊。重複?檢查出來 – LBA

+0

我看到了,但問題表明他的問題不是他不知道如何將必要的類插入到偵聽器中,而是當他這樣做時會創建循環引用錯誤,從而完全打破框架。 (不知道爲什麼,但要弄清楚,你需要看看項目的完整的DI層次結構) – Joe