[英]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'];
這是一個棘手的問題。 創建教義服務時,偵聽器將在構建時附加。 如果您要構建的偵聽器以任何方式使用要求教義的其他服務(或其他某些服務),則您將獲得循環引用。
但是您可以圍繞它構建。
這樣實現的是:僅在實際觸發自定義事件時,才會初始化自定義事件偵聽器。 到那時,諸如學說之類的關鍵服務已經啟動並運行,您可以避免循環引用問題。
我的項目中有一個類似的問題,並以此方式解決了。 不太確定這是否是最優雅的方法,但肯定可以。 (如果有人有更好的解決方案,我也歡迎)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.