Абонент звонит дважды Symfony - PullRequest
0 голосов
/ 12 июня 2018

Я использую 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();

с этим фрагментом кода, но я не знаю, является ли онлучшая практика

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

В моем случае с 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 слушатели событий и подписчики автоматически регистрируются в своем классе.имя в качестве ключа (при некоторых условиях по умолчанию - необходимо прочитать по этой теме).Поэтому нет необходимости регистрировать их явно как услуги.В любом случае, мы делаем это, но используя произвольный ключ вместо имени класса, будет две службы.

0 голосов
/ 13 июня 2018

Если вы используете Autowiring / Autoconfiguration, возможно, вы добавили услугу подписчика, которую вы показывали выше, дважды.Я сделал это сам, когда впервые добавил автоматическую разводку, но у меня также был явно указан абонент в конфигурации.

Вы можете увидеть, какие события зарегистрированы (и проверить, зарегистрированы ли какие-либо события более одного раза).выполнить ту же услугу / действие) с:

bin/console debug:event-dispatcher
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...