簡體   English   中英

Symfony2在登錄事件偵聽器中獲得用戶登錄

[英]Symfony2 get logged in user in doctrine event listener

我為該理論的postPersist,PostUpdate和postRemove方法創建了一個事件偵聽器類。

我需要在班級中登錄用戶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->container->get('auth.user')->getIdentity()['id']; $this->persist()之前的代碼中登錄了用戶信息$this->container->get('auth.user')->getIdentity()['id'];

這是一個棘手的問題。 創建教義服務時,偵聽器將在構建時附加。 如果您要構建的偵聽器以任何方式使用要求教義的其他服務(或其他某些服務),則您將獲得循環引用。

但是您可以圍繞它構建。

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

這樣實現的是:僅在實際觸發自定義事件時,才會初始化自定義事件偵聽器。 到那時,諸如學說之類的關鍵服務已經啟動並運行,您可以避免循環引用問題。

我的項目中有一個類似的問題,並以此方式解決了。 不太確定這是否是最優雅的方法,但肯定可以。 (如果有人有更好的解決方案,我也歡迎)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM