Symfony UseLocaleSubscriber 和 InMemoryUser

Symfony UseLocaleSubscriber and InMemoryUser

我有 UserLocaleSubscriber 来自 Symfony 文档的用户切换区域设置。但是我的管理员用户存储在“内存中”,InMemoryUser class 没有 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',
        ];
    }
}

如果用户实例不是 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());
   }
}