Symfony getUser() внутри EventSubscriber


person Alex.Barylski    schedule 23.10.2020    source источник
comment
Это вопрос времени. Ваш подписчик создается до того, как будет выполнена обработка пользователя. Просто сохраните $tokenStorage (или еще лучше $security) в качестве переменной экземпляра, а затем выполните $security->getUser(), когда вам действительно понадобится пользователь. Пока ваш метод подписчика вызывается после того, как пользовательский слушатель делает это, все должно работать.   -  person Cerad    schedule 23.10.2020
comment
Я так понял... но я не уверен, что вы имеете в виду store $security? Могу ли я не менять приоритет своего абонента, чтобы он происходил после авторизации?   -  person Alex.Barylski    schedule 23.10.2020
comment
$security относится к внедрению Security $security, как показано в приведенном ниже частично правильном ответе вместо TokenStorage. Использование Security позволяет сэкономить небольшой кусок кода и является рекомендуемым методом получения пользователя. И да, используйте приоритет, если необходимо, чтобы ваш слушатель срабатывал после пользовательского слушателя Symfony.   -  person Cerad    schedule 23.10.2020
comment
Я попробовал Безопасность и изменил приоритет services.yaml ... по-прежнему без кубиков (см. Исходное сообщение для обновленного кода). Я очистил кеш, нет! Любые идеи?   -  person Alex.Barylski    schedule 23.10.2020
comment
Вы используете подписчика DoctrineBundle EventSubscriber или Symfony EventDispatcher?   -  person Cerad    schedule 23.10.2020
comment
О боже... я думаю??? (Доктрина\Общие\EventSubscriber)   -  person Alex.Barylski    schedule 23.10.2020
comment
Вот чему я следовал: symfony.com/doc/current/ доктрина/   -  person Alex.Barylski    schedule 23.10.2020
comment
Приоритет влияет только на прослушиватели событий ядра. У Doctrine есть собственный диспетчер событий и слушатель. По-видимому, некоторые события Doctrine запускаются до того, как пользователь становится доступным. Если вам всегда нужен пользователь, просто добавьте код, чтобы игнорировать любые события, запускаемые при доступности пользователя. Или пересмотрите свой подход. События доктрины могут быть очень обидчивыми.   -  person Cerad    schedule 23.10.2020


Ответы (1)


Вы можете внедрить компонент безопасности внутри любого сервиса:

use Symfony\Component\Security\Core\Security;

class SomeSubscriber implements EventSubscriber
{
    private $security = null;
    private $user = null;
    
    // ...

    public function __construct(Security $security)
    {
        $this->security = $security;
        //$this->user = $this->security->getUser();
    }

}
person agrandy    schedule 23.10.2020
comment
Интересно, это из-за того, что я слушаю эти доктринальные события? - person Alex.Barylski; 23.10.2020
comment
Чтобы проверить это, можете ли вы поместить пользователя в другую службу, например, в контроллер? - person agrandy; 23.10.2020
comment
Да, я могу получить пользователя внутри контроллеров без проблем ... Я почти уверен, что это проблема синхронизации, как указано выше, просто не знаю, как ее обойти, кроме как изменить приоритет подписчика ??? - person Alex.Barylski; 23.10.2020