2017-04-06 84 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