1

UserLocaleSubscriber从 Symfony 文档中获得了用户切换语言环境的信息。但是我的管理员用户存储在“内存中”,并且InMemoryUser该类没有该getLocale()方法。

我如何才能仅为用户User实体运行此订阅者。我试过isGranted()但无法让它工作。

class UserLocaleSubscriber implements EventSubscriberInterface
{
    private $session;

    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    public function onInteractiveLogin(InteractiveLoginEvent $event)
    {
        $user = $event->getAuthenticationToken()->getUser();

        if (null !== $user->getLocale()) {
            $this->session->set('_locale', $user->getLocale());
        }
    }

    public static function getSubscribedEvents()
    {
        return [
            SecurityEvents::INTERACTIVE_LOGIN => 'onInteractiveLogin',
        ];
    }
}
4

1 回答 1

1

如果用户实例不是类型Symfony\Component\Security\Core\User\InMemoryUser(如果您使用的是 Symfony 5.3),或者Symfony\Component\Security\Core\User\User 您还没有获得该版本,则仅应用区域设置更改。

或者更好的是,检查您获得的用户实体是否是您所期望的。假设您的用户实体是App\Entity\User

public function onInteractiveLogin(InteractiveLoginEvent $event)
{
   $user = $event->getAuthenticationToken()->getUser();

   if ( $user instanceof App\Entity\User && null !== $user->getLocale()) {
      $this->session->set('_locale', $user->getLocale());
   }
}
于 2021-07-18T17:28:40.993 回答