用户呼叫两次symfony

用户呼叫两次symfony,symfony,Symfony,我在提交表单后使用FOSUserEvents,但订户呼叫两次 这样一来,我的验证码第一次有效,第二次无效 这是我的密码 <?php namespace AppBundle\EventListener; class CaptchaSubscriber implements EventSubscriberInterface { private $router; private $requestStack; private $templating; /

我在提交表单后使用FOSUserEvents,但订户呼叫两次

这样一来,我的验证码第一次有效,第二次无效

这是我的密码

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