gpt4 book ai didi

php - 事件 FOSUserBundle Symfony2 注册和登录

转载 作者:可可西里 更新时间:2023-11-01 13:54:50 26 4
gpt4 key购买 nike

我正在尝试在 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();
}
}

还有我的服务

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

最佳答案

两点:

  1. 服务定义中- { name: 'kernel.event_subscriber'} 就够了,没有事件入口。这是订阅者和听众之间的区别。一个监听器只能监听一个事件,通过服务定义中的 eventmethod 参数定义。订阅者可以监听多个事件,通过方法 getSubscribedEvents() 定义,因此服务定义中不需要更多参数。

  2. 第二点,您正在对事件类(UserEventFilterUserResponseEvent)进行类型提示,但您从未导入它们,因此 PHP 假定它们在同一位置命名空间(如错误消息中所述)。

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

关于php - 事件 FOSUserBundle Symfony2 注册和登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17566446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com