2013-07-10 15 views
5

Ich versuche Ereignisse auf FOSUserBundleEvents FOSUserBundle Symfony2 auf Register und Login

<?php 
namespace EasyApp\UserBundle\Service; 

use Symfony\Component\Security\Core\SecurityContext; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine; 
use EasyApp\UserBundle\Entity\UserLogin; 
use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\FormEvent; 
use FOS\UserBundle\FOSUserBundle; 


class LoginManager implements EventSubscriberInterface 
{ 
    /** @var \Symfony\Component\Security\Core\SecurityContext */ 
    private $securityContext; 

    /** @var \Doctrine\ORM\EntityManager */ 
    private $em; 

    /** 
    * Constructor 
    * 
    * @param SecurityContext $securityContext 
    * @param Doctrine  $doctrine 
    */ 
    public function __construct(SecurityContext $securityContext, Doctrine $doctrine) 
    { 
     $this->securityContext = $securityContext; 
     $this->em = $doctrine->getEntityManager(); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(
       FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onSecurityImplicitLogin', 
       FOSUserEvents::REGISTRATION_COMPLETED=> 'onRegistrationCompleted' 
     ); 
    } 

    public function onSecurityImplicitLogin(UserEvent $event) 
    { 
     die; 
     $user = $event->getAuthenticationToken()->getUser(); 
     $request = $event->getRequest(); 

     if ($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) { 
      // user has just logged in 
      $this->saveLogin($request, $user); 
     } 
    } 

    public function onRegistrationCompleted(FilterUserResponseEvent $event){ 
     $user = $event->getAuthenticationToken()->getUser(); 
     $request = $event->getRequest(); 
     saveLogin($request, $user); 
    } 

    public function saveLogin($request, $user){ 
     $login = new UserLogin(); 
     $login->setIp($request->getClientIp()); 
     $login->setUser($user); 

     $this->em->persist($login); 
     $this->em->flush(); 
    } 
} 

Und

meinen Dienst
services: 
    user_login_manager: 
     class: 'EasyApp\UserBundle\Service\LoginManager' 
     arguments: ['@security.context', '@doctrine'] 
     tags: 
      - { name: 'kernel.event_subscriber', event: 'fos_user.security.interactive_login'} 
      - { name: 'kernel.event_subscriber', event: 'fos_user.registration.completed'} 

Aber ich Probleme haben, umzusetzen. Wenn ich mich einloggen passiert nichts, der getSubscribedEvents() heißt aber nicht onSecurityImplicitLogin(UserEvent $event)

Und das andere Problem ist auf Register. Folgende Fehler tritt auf onSecurityImplicitLogin(UserEvent $event)

Catchable Fatal Error: Argument 1 passed to EasyApp\UserBundle\Service\LoginManager::onSecurityImplicitLogin() must be an instance of EasyApp\UserBundle\Service\UserEvent, instance of FOS\UserBundle\Event\UserEvent given in /Users/antoine/Documents/projects/easyApp/application/src/EasyApp/UserBundle/Service/LoginManager.php line 46 

und wenn ich diese Zeile Kommentar habe ich den gleichen Fehler auf onRegistrationCompleted(FilterUserResponseEvent $event)

bearbeiten

services: 
    user_login_manager: 
     class: 'EasyApp\UserBundle\Service\LoginManager' 
     arguments: ['@security.context', '@doctrine'] 
     tags: 
      - { name: 'kernel.event_subscriber'} 
      - { name: 'kernel.event_listener', event: 'security.interactive_login' } 

Antwort

7

Zwei Punkte:

  1. Im Dienst Definition - { name: 'kernel.event_subscriber'} ist genug, kein Ereigniseintrag. Dies ist der Unterschied zwischen Teilnehmer und Hörer. Ein Listener kann nur ein Ereignis abhören, definiert durch event und method Parameter in der Service-Definition. Ein Teilnehmer kann mehrere Ereignisse abhören, die durch die Methode getSubscribedEvents() definiert sind, so dass keine weiteren Parameter in der Dienstdefinition benötigt werden.

  2. Zweiter Punkt sind Sie Type Hinting gegen die Ereignisklassen (UserEvent und FilterUserResponseEvent), aber man sie nie importiert, so PHP sie im gleichen Namensraum übernimmt (wie in der Fehlermeldung genannten).

    use FOS\UserBundle\Event\UserEvent; 
    use FOS\UserBundle\Event\FilterUserResponseEvent; 
    
+0

Vielen Dank für Ihre Antwort, aber ich hinzufügen - {name: 'kernel.event_listener', Veranstaltung: 'security.interactive_login'} in meinem Dienst normale Login zu erkennen – Ajouve

+0

Hat Mischen 'kernel.event_listener' und 'kernel.event_subscriber' Tags funktionieren? –

+1

Ja, das funktioniert, ich bearbeite meinen Post mit meinem neuen Service – Ajouve

Verwandte Themen