2013-07-26 6 views
8

Sto provando a inserire l'utente attualmente connesso in un listener. Il mio obiettivo è scrivere un \ DateTime() corrente nella colonna 'last_active' della mia tabella 'demo_user' ogni volta che l'utente esegue un'azione (entrambi i metodi this non funzionano per me).Symfony2 - Inietta l'utente attualmente connesso a un listener

app/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(); 
      } 
     } 
    } 
} 

Ma il $ token è sempre vuoto ... UPDATE: non ha menzionato, che ho effettuato l'accesso autenticato e quando questo accade

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

Qualche idea? Arrgh, grazie, Jan

UPDATE:

Ho provato anche solo per iniettare il security.context:

arguments: ["@security.context"] 

ma ottenuto un

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

Non una soluzione ellegant ma: http://stackoverflow.com/questions/7561013/injecting- securitycontext-services-in-a-listener-class-in-symfony2-cause-circ –

+0

Penso che sto esattamente cercando di farlo al momento, ma senza alcun successo – jxp315

+0

Il link fornito da @JovanPerovic va bene. La risposta corretta è questa: http://stackoverflow.com/questions/7561013/injecting-securitycontext-into-a-listener-prepersist-or-preupdate-in-symfony2-to#26011863 – webDEVILopers

risposta

2

per symfony 2.4 si dovrebbe essere in grado di iniettare espressione, così invece di @service_container uso @=service('security.context').getToken().getUser() per ottenere utente direttamente

+2

Ciao, ho provato questo ma io hanno lo stesso problema: * Rilevato riferimento circolare per il servizio "doctrine.orm.default_entity_manager" *. Sembra chiamare "@ security.context" mentre l'uso di un 'doctrine.event_listener' genera ancora l'errore. –

+0

questo ha funzionato perfettamente per me. Grazie genio di Symfony –

0

La soluzione al problema di riferimento circolare quando si inietta l'utente corrente si sta implementando un utente chiamabile.

È possibile utilizzare la classe UserCallable fornito da KnpDoctrineBehaviors.

All'inizio è necessario creare un servizio dalla classe chiamabile utente e iniettare il contenitore in esso.

è possibile trovare un esempio YML su come fare questo nel config fornito da KnpDoctrineBehaviors.

Ora inserisci il tuo servizio UserCallable nel listener e recupera l'utente dal chiamante utente come puoi vedere nello source of Blameable listener.