Различия в диспетчеризации и обработке событий в Symfony 2.8 и 3.4?

Я работаю над миграцией Symfony 2.8 проект для Symfony 3.4, Проект использует Doctrine 2.6.3 а также FOSUserBundle 2.1.2,

Проект слушает FOSUserEvents::REGISTRATION_CONFIRMED выполнить некоторые дополнительные настройки при создании и подтверждении новой учетной записи пользователя.

public static function getSubscribedEvents() {
return array(
FOSUserEvents::REGISTRATION_CONFIRMED => 'onRegistrationConfirmed',
);
}

public function onRegistrationConfirmed(FilterUserResponseEvent $event) {
$this->logger->info("onRegistrationConfirmed");
$user = $event->getUser();

// Do some additional setup. While the confirmed user in known here,
// other setup classes / methods get the current user from tokenStorage
ThirdPartySetupCode();
}


// Some 3rd party class I cannot change
public function ThirdPartySetupCode() {
$token = $this->tokenStorage->getToken();

if (!$token) {
$user = $token->getUser();
...
}
}

Кажется, что есть некоторые различия в том, как события обрабатываются в Symfony 2.8 а также Symfony 3.4:

Хотя приведенный выше код работает без каких-либо проблем в Symfony 2.8 это терпит неудачу в Symfony 3.4 так как $token->getUser() не возвращает допустимый объект пользователя, а только строку anon.Анонимный пользователь.

Вот как события обрабатываются в Symfony 2.8:

dispatch: kernel.request
dispatch: security.authentication.success
dispatch: kernel.controller
dispatch: fos_user.registration.confirm
dispatch: fos_user.registration.confirmed
dispatch: fos_user.security.implicit_login
onRegistrationConfirmed

Удивительно, что onRegistrationConfirmed вывод журнала сразу после fos_user.registration.confirmed, Не должен ли обработчик выполняться сразу после запуска события?

Вместо fos_user.security.implicit_login событие отправляется (и обрабатывается?) сначала и только потом onRegistrationConfirmed обработчик?

Почему это? Однако, хотя я не понимаю этого поведения, оно приводит к желаемому результату: поскольку обработчик (и вместе с ним сторонний код) запускается после завершения входа в систему, токен возвращает правильного пользователя.

Вот как события обрабатываются в Symfony 3.4:

dispatch: kernel.request
dispatch: security.authentication.success
dispatch: kernel.controller
dispatch: kernel.controller_arguments
dispatch: fos_user.registration.confirm
dispatch: fos_user.registration.confirmed
onRegistrationConfirmed
dispatch: fos_user.security.implicit_login

Здесь onRegistrationConfirmed обработчик выполняется сразу после fos_user.registration.confirmed событие.

Хотя я понимаю, что такое поведение приводит к неверному результату: обработчик (а вместе с ним и сторонний код) запускает БЕЗ входа в систему полностью, и, следовательно, токен не возвращает действительного пользователя.

Как решить эту проблему? Поскольку я не могу изменить сторонний код, мне придется отложить обработку fos_user.registration.confirmed как-то, так что вход в систему завершен первым. Можно ли это сделать?

Является ли эта разница в распределении событий и обработке предполагаемого изменения между Symfony 2.8 а также Symfony 3.4? Я не нашел никакой информации по этому вопросу.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector