我有一个Symfony 3应用程序,通过FOSUserBundle进行用户管理。我想通过检查用户" last_login"来实现一个检查初始用户登录的Listener类。值。虽然我确实阅读了article on event subscribers,但我很难找到更新last_login值的确切时间。 是否有人有这样的知识,或者有人知道关于用户初次登录的更好方法吗?
答案 0 :(得分:1)
我刚看了一眼,看来你可以使用eventSubscriber来订阅SecurityEvents :: INTERACTIVE_LOGIN事件,以获得你需要的位置。
class RegistrationSubscriber implements EventSubscriberInterface
{
private $tokenStorage;
public function __construct(TokenStorage $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public static function getSubscribedEvents()
{
return [
SecurityEvents::INTERACTIVE_LOGIN => [
['lastLogin', 150],
],
];
}
public function lastLogin(InteractiveLoginEvent $event){
$user = $this->tokenStorage->getToken()->getUser();
if($user->getLastLogin() == null){
//Do something
}
}
在第一次登录时的测试中,$ user-> getLastLogin()为null,因此您可以在此处输入所需的任何逻辑。
答案 1 :(得分:1)
Symfony和FOSUserBundle有相关事件。甚至FOSUserBundle也有这些事件的事件订阅者
/**
* @return array
*/
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
);
}
您可以订阅这些活动并制作自己的逻辑。在symfony中没有初始登录这样的thibg,你需要自己管理。
订阅活动并尝试这样的事情:
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event){
$user = $event->getAuthenticationToken()->getUser();
//some logic to check the user
if(!$user->getLastLogin()){
//its my first login!!! do what ever you want here
}else{
//I have already logged before so just pass
}
}
此外,您需要将您的订阅者优先级更改为-10或类似的内容,以便在FOSUserBundle之前捕获事件,或者您将始终通过。
希望有所帮助