Ajo*_*uve 5 php events symfony fosuserbundle
我正在尝试在FOSUserBundle上实现事件
<?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();
}
}
Run Code Online (Sandbox Code Playgroud)
而我的服务
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'}
Run Code Online (Sandbox Code Playgroud)
但我有问题.当我没有登录时,会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
Run Code Online (Sandbox Code Playgroud)
如果我评论这一行,我得到了相同的错误 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' }
Run Code Online (Sandbox Code Playgroud)
两点:
在服务定义- { name: 'kernel.event_subscriber'}就足够了,没有事件输入.这是订阅者和监听者之间的区别.侦听器只能侦听一个事件,在服务定义中定义了槽event和method参数.订阅者可以监听通过该方法定义的多个事件,getSubscribedEvents()因此不需要服务定义中的其他参数.
第二点,您是对事件类(UserEvent和FilterUserResponseEvent)的类型提示,但您从未导入它们,因此PHP假定它们位于相同的命名空间中(如错误消息中所述).
use FOS\UserBundle\Event\UserEvent;
use FOS\UserBundle\Event\FilterUserResponseEvent;
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
8089 次 |
| 最近记录: |