Я работаю над миграцией 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
? Я не нашел никакой информации по этому вопросу.
Задача ещё не решена.
Других решений пока нет …