用户呼叫两次symfony
我在提交表单后使用FOSUserEvents,但订户呼叫两次 这样一来,我的验证码第一次有效,第二次无效 这是我的密码用户呼叫两次symfony,symfony,Symfony,我在提交表单后使用FOSUserEvents,但订户呼叫两次 这样一来,我的验证码第一次有效,第二次无效 这是我的密码 <?php namespace AppBundle\EventListener; class CaptchaSubscriber implements EventSubscriberInterface { private $router; private $requestStack; private $templating; /
<?php
namespace AppBundle\EventListener;
class CaptchaSubscriber implements EventSubscriberInterface
{
private $router;
private $requestStack;
private $templating;
/**
* RedirectAfterRegistrationSubscriber constructor.
*/
public function __construct(RouterInterface $router, RequestStack $requestStack, \Twig_Environment $templating)
{
$this->router = $router;
$this->requestStack = $requestStack;
$this->templating = $templating;
}
public function onRegistrationInit(GetResponseUserEvent $event)
{
if ($this->requestStack->getMasterRequest()->isMethod('post')) {
...handle captcha...
}
}
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInit'
];
}
}
有了这个代码片段,代码就可以运行了,但我不知道这是否是最佳实践如果您使用的是自动布线/自动配置,那么您可能已经添加了上面显示的订户服务两次。当我第一次添加自动布线时,我自己也做过,但我也在配置中明确列出了订户 您可以通过以下方式查看已注册的事件(并检查是否有任何事件已注册多次以执行相同的服务/操作):
在我的symfony 4.2案例中,它取决于服务定义是否发生 如果我这样定义服务,我的订户会注册两次:
# oauth process listener
app.subscriber.oauth:
class: App\EventListenerSubscriber\OauthSubscriber
arguments: ['@session', '@router', '@security.token_storage', '@event_dispatcher', '@app.entity_manager.user', '@app.fos_user.mailer.twig_swift']
tags:
- { name: kernel.event_subscriber }
但如果我把定义变成这样,它只会注册一次:
# oauth process listener
App\EventListenerSubscriber\OauthSubscriber:
arguments: ['@session', '@router', '@security.token_storage', '@event_dispatcher', '@app.entity_manager.user', '@app.fos_user.mailer.twig_swift']
tags:
- { name: kernel.event_subscriber }
我在github上发布了一个bug报告,并立即得到了一个答案,即在较新的symfony版本中,事件侦听器和订阅者会自动注册,并将其类名作为密钥(在某些默认条件下,必须阅读该主题)。
因此,没有必要将它们明确注册为服务。
我知道我们还是这样做的,但是使用任意键而不是类名,将有两个服务 请不要将答案编辑到问题中。取而代之的是,使用下面的答案部分来扩展解决问题的方法。只有当您使用“点符号”而不是FQCN显式引用服务时,才可能这样做。如果您使用FQCN,您可以显式定义它,而不会出现任何重复调用的问题。谢谢@alister,我使用命令控制台进行了检查,我的服务只注册了一次。是,I uso自动接线/自动配置
# oauth process listener
app.subscriber.oauth:
class: App\EventListenerSubscriber\OauthSubscriber
arguments: ['@session', '@router', '@security.token_storage', '@event_dispatcher', '@app.entity_manager.user', '@app.fos_user.mailer.twig_swift']
tags:
- { name: kernel.event_subscriber }
# oauth process listener
App\EventListenerSubscriber\OauthSubscriber:
arguments: ['@session', '@router', '@security.token_storage', '@event_dispatcher', '@app.entity_manager.user', '@app.fos_user.mailer.twig_swift']
tags:
- { name: kernel.event_subscriber }