symfony - 订阅者调用两次 symfony

标签 symfony

我在提交表单后使用 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 是 3.3

更新

我加了

        $event->stopPropagation();

有了这段代码,代码就可以工作了,但我不知道这是否是最佳实践

最佳答案

在我的 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 上发布了一个错误报告并立即得到了答案,在较新的 symfony 版本中,事件监听器和订阅者会自动注册,并将它们的类名作为键(在某些默认条件下 - 必须阅读该主题)。 因此无需将它们显式注册为服务。 无论如何我们都这样做,但是使用任意键而不是类名,将有两个服务。

关于symfony - 订阅者调用两次 symfony,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825354/

相关文章:

php - 以多对多关系 symfony2 的形式设置多个 ='false'

php - Vagrant + Apache + PHP 在 Windows 上运行速度极慢

Symfony2 + FOS Rest Bundle - 常规路线

php - 实体验证后如何获取错误消息

symfony - 如何在要求我在 phpunit.xml 中设置 KERNEL_DIR 的 PHPUnit 中解决此问题?

sqlite - 无法将数据放入我的数据库

jquery - 简易饼图 : Bug percentage not centered?

ajax - Blueimp jQuery 文件上传和 symfony2 : issue with custom upload handler

symfony - 如何将 callable 注入(inject) Symfon2 依赖注入(inject)容器服务

php - symfony - IS_AUTHENTICATED_ANONYMOUSLY 不工作