Search code examples
phpsymfonysymfony-securitysymfony-translator

Symfony UseLocaleSubscriber and InMemoryUser


I have UserLocaleSubscriber from Symfony documentation for switch locale by user. But my admin user is stored "In memory", and the InMemoryUser class does not have the getLocale() method.

How may I run this subscriber only for user User entity. I tried isGranted() but couldn't get it to work.

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',
        ];
    }
}

Solution

  • Only apply the locale change if the user instance is not of type Symfony\Component\Security\Core\User\InMemoryUser (if you are on Symfony 5.3), or Symfony\Component\Security\Core\User\User if you haven't gotten to that version yet.

    Or better, check that the user entity you are getting is the one you expect. Let's say your user entity is 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());
       }
    }