En esta sencilla entrada quiero dejarles la forma para establecer el idioma del usuario en la sesión con Symfony y FOSUserBundle.
La idea es que en el perfil del usuario se añada un campo donde se pregunte el idioma predeterminado que quiere usar el usuario, el formulario de registro seria más o menos así:
El campo locale es el que se almacenará y lo tomará Symfony en la sesión.
Ahora, la idea es crear dos Listener en el proyecto, el primero es LocaleListener que trae el atributo locale de la sesión y se similar a esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class LocaleListener implements EventSubscriberInterface { private $defaultLocale; public function __construct($defaultLocale = 'en') { $this->defaultLocale = $defaultLocale; } public function onKernelRequest(GetResponseEvent $event) { $request = $event->getRequest(); if (!$request->hasPreviousSession()) { return; } if ($locale = $request->attributes->get('_locale')) { $request->getSession()->set('_locale', $locale); } else { $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); } } public static function getSubscribedEvents() { return array( KernelEvents::REQUEST => array(array('onKernelRequest', 17)), ); } } |
El segundo listener UserLocaleListener y lo que hace es traer el parámetro locale del perfil del usuario y se ve así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class UserLocaleListener { /** * @var Session */ private $session; public function __construct(Session $session) { $this->session = $session; } /** * @param InteractiveLoginEvent $event */ public function onInteractiveLogin(InteractiveLoginEvent $event) { $user = $event->getAuthenticationToken()->getUser(); if (null !== $user->getLocale()) { $this->session->set('_locale', $user->getLocale()); } } } |
Y por último nos queda agregar este par de servicios en services.yml
1 2 3 4 5 6 7 8 9 10 11 |
app.locale_listener: class: AppBundle\EventListener\LocaleListener arguments: ['%kernel.default_locale%'] tags: - { name: kernel.event_subscriber } app.user_locale_listener: class: AppBundle\EventListener\UserLocaleListener arguments: ['@session'] tags: - { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin } |
Y eso es todo!
Les dejó los gist de los tres archivos:
services.yml, LocaleListener.php, UserLocaleListener
Una aclaración, esto lo ví en algún lado, no es de mi autoría, así que si alguien sabe del dueño por favor me informa para darle el crédito.
Saludos!