2013-07-26 3 views
8

Я пытаюсь ввести текущего пользователя в Слушатель. Моя цель - записать текущий \ DateTime() в столбец «last_active» моей таблицы «demo_user» каждый раз, когда пользователь делает какое-либо действие (оба этих метода this не работают для меня).Symfony2 - Ввести пользователя, который в настоящее время вошел в систему, в прослушиватель

приложение/Config/config.yml

# ... 
services: 
    demo.listener: 
     class: Demo\UserBundle\EventListener\ActivityWatcher.php 
     arguments: ['@service_container'] 
     tags: 
      - { name: doctrine.event_listener, event: postLoad } 

SRC/Demo/UserBundle/EventListener/ActivityWatcher.php

namespace Demo\UserBundle\EventListener; 

use Doctrine\ORM\Event\LifecycleEventArgs; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Demo\UserBundle\Entity\DemoUser; 

class ActivityWatcher 
{ 

    protected $container; 

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


    public function postLoad(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     $entityManager = $args->getEntityManager(); 

     if ($entity instanceof DemoUser) { 
      $token = $this->container->get('security.context')->getToken(); 
      $user = $token->getUser(); 

      if($entity->getId() == $user->getId()) { 
       $entity->setLastActivity(new \DateTime()); 
       $entityManager->persist($entity); 
       $entityManager->flush(); 
      } 
     } 
    } 
} 

Но $ лексема всегда пусто ... ОБНОВЛЕНИЕ: не упоминалось, что я вошел в систему и прошел аутентификацию, когда это произойдет

FatalErrorException: Error: Call to a member function getUser() 
on a non-object ... 

Любые идеи? Arrgh, спасибо, Ян

UPDATE:

Я также попытался только впрыскивать security.context:

arguments: ["@security.context"] 

но получил

ServiceCircularReferenceException: Circular reference detected for "doctrine.orm.default_entity_manager", path: "doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> wwk.listener -> security.context -> security.authentication.manager -> security.user.provider.concrete.administrators". 
+0

не является ellegant решение, но: http://stackoverflow.com/questions/7561013/injecting- securitycontext-services-in-a-listener-class-in-symfony2-cause-circ –

+0

Я думаю, что я точно пытаюсь сделать это на данный момент, но без успеха – jxp315

+0

Ссылка, предоставленная @JovanPerovic, в порядке. Правильный ответ таков: http://stackoverflow.com/questions/7561013/injecting-securitycontext-into-a-listener-prepersist-or-preupdate-in-symfony2-to#26011863 – webDEVILopers

ответ

2

для symfony 2.4 вы должны иметь возможность вводить выражение, так вместо @service_container использовать @=service('security.context').getToken().getUser() получить непосредственно пользователю

+2

Привет, я попробовал это, но я имеют ту же проблему: * Обнаружена циклическая ссылка для службы «doctrine.orm.default_entity_manager» *. Похоже на вызов '@ security.context' при использовании' doctrine.event_listener' все еще вызывает ошибку. –

+0

это отлично сработало для меня. Спасибо, Symfony genie –

0

Решение для круговой опорной задачи при введении текущего пользователя реализуется пользователь, вызываемый.

Вы можете использовать класс UserCallable, предоставляемый KnpDoctrineBehaviors.

Сначала вам необходимо создать сервис из класса, вызываемого пользователем, и вставить в него контейнер.

Вы можете найти пример YML о том, как это сделать в конфигурации, предоставленной KnpDoctrineBehaviors.

Теперь добавьте свою службу UserCallable в свой прослушиватель и извлеките пользователя из вызываемого пользователя, как вы можете видеть в source of Blameable listener.

Смежные вопросы