2013-07-10 3 views
5

Я пытаюсь осуществить мероприятия по FOSUserBundleСобытия FOSUserBundle Symfony2 по регистрации и входа

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

И моя служба

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'} 

Но у меня есть проблемы. Когда я не вхожу в систему, ничего не происходит, вызывается getSubscribedEvents(), но не onSecurityImplicitLogin(UserEvent $event)

И другая проблема находится на регистре. После ошибки происходит на 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 

и если я закомментировать эту строку, я получил ту же ошибку на onRegistrationCompleted(FilterUserResponseEvent $event)

Редактировать

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' } 

ответ

7

Две точки:

  1. В службе определения - { name: 'kernel.event_subscriber'} достаточно, никакой записи события. Это разница между подписчиком и слушателем. Слушатель может прослушивать только одно событие, определенное определение event и method параметров в определении сервиса. Абонент может прослушивать несколько событий, определенных методом getSubscribedEvents(), поэтому никаких дополнительных параметров в определении службы не требуется.

  2. Второй момент, вы типа намекая против событий классов (UserEvent и FilterUserResponseEvent), но вы никогда не импортировали их, поэтому PHP принимает их в том же пространстве имен (как сказано в сообщении об ошибке).

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

Спасибо за ваш ответ, но я добавлю - {имя: 'kernel.event_listener', событие: 'security.interactive_login'} в моей службе, чтобы обнаружить нормальный вход – Ajouve

+0

ли смешивание 'kernel.event_listener' и 'kernel.event_subscriber' работают? –

+1

Да, это работает, я редактирую свой пост с моей новой услугой – Ajouve