2013-07-26 11 views
8

Ich versuche den aktuell angemeldeten Benutzer in einen Listener zu injizieren. Mein Ziel ist es, ein aktuelles \ DateTime() in die 'last_active' Spalte meiner 'demo_user' Tabelle jedes Mal zu schreiben, wenn der Benutzer eine Aktion ausführt (beide this Methoden funktionieren nicht für mich).Symfony2 - Injizieren Sie den aktuell angemeldeten Benutzer in einen 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(); 
      } 
     } 
    } 
} 

Aber die $ Token ist immer leer ... UPDATE: Nicht erwähnt, dass ich eingeloggt und authentifiziert bin, wenn dies passiert

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

Irgendwelche Ideen? Arrgh, danke, Jan

UPDATE:

Ich habe auch versucht, nur die security.context zu injizieren:

arguments: ["@security.context"] 

aber bekam eine

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

keine ellegant Lösung zu erhalten: http://stackoverflow.com/questions/7561013/injecting- securitycontext-services-in-a-listener-class-in-symfony2-causes-circ –

+0

Ich denke, ich versuche genau das im Moment, aber ohne Erfolg – jxp315

+0

Der Link von @JovanPerovic ist in Ordnung. Die richtige Antwort ist diese: http://stackoverflow.com/questions/7561013/injecting-securitycontext-into-a-listener-prepersist-or-preupdate-in-symfony2-to#26011863 – webDEVILopers

Antwort

2

für symfony 2.4 sollten Sie in der Lage sein, die Expression so statt @service_container Verwendung @=service('security.context').getToken().getUser() Benutzer zu injizieren, direkt aber

+2

Hallo, ich habe versucht, aber ich haben das gleiche Problem: * Kreisreferenz für Dienst "doctrine.orm.default_entity_manager" * gefunden. Es sieht so aus, als ob man '@ security.context' aufruft, während ein 'doctrine.event_listener' den Fehler immer noch auslöst. –

+0

das funktionierte perfekt für mich. Danke Symfony Genie –

0

Die Lösung des Kreisreferenz Problem Beim Injizieren implementiert der aktuelle Benutzer einen aufrufbaren Benutzer.

Sie können die Klasse UserCallable von KnpDoctrineBehaviors verwenden.

Zunächst müssen Sie einen Service aus der Benutzerklasse erstellen und den Container in den Benutzer injizieren.

Ein YML-Beispiel finden Sie in der von KnpDoctrineBehaviors bereitgestellten Konfiguration.

Jetzt injizieren Sie Ihren UserCallable-Dienst in Ihren Listener und rufen Sie den Benutzer vom Benutzer abrufbar ab, wie Sie in der source of Blameable listener sehen können.

Verwandte Themen