Symfony2. Configurar Pantalla de login con internacionalización activada

jueves, 1 de noviembre de 2012 Etiquetas: ,

Introducción

En esta entrada trataré un problema que me ha surgido al habilitar la internacionalización de Symfony,  y es que se pierde la funcionalidad de login de usuarios que hasta el momento funcionaba correctamente.

Cómo es normal, cuando activamos la opción de internacionalización (i18n) de nuestra aplicación, queremos que el formulario de login se muestre en el idioma del usuario, con lo que la ruta pasa a ser, por ejemplo, /es/login y /es/login_check, o /en/login y /en/login_check.

Ahora nos toca modificar el archivo security.yml, que es donde se configuran los temas seguridad, como bien indica su nombre. Ahí indicamos que path de nuestra aplicación se encarga de realizar el login, login_check y logout. Si no se sabe como configurar estas tres rutas correctamente para que funcionen con diferentes idiomas, no funcionará. Veamos como hacerlo.

Solución

Una vez visto el problema vamos a ver la solución. Lo primero que podemos pensar en crear un fichero de configuración de este tipo, por lo menos es lo que intenté yo:


# app/config/security.yml
secured_area:
        pattern:    ^/
        anonymous: ~
            form_login:
                login_path:  ^/(es|en)/login
                check_path:  ^/(es|en)/login_check

Pero al probarlo veremos que no funciona. Así, que después de mirar documentación y foros de internet, di con la solución, esta es tan sencilla como no utilizar paths en la definición de las rutas, sino nombres definidos en nuestros archivos de rounting. Veamos un ejemplo, que es como mejor se entienden las cosas:


# app/config/security.yml
secured_area:
        pattern:    ^/
        anonymous: ~
            form_login:
                login_path:  _login
                check_path:  _login_check


// src/Acme/SecurityBundle/Controller/SecurityController.php;

/**
* @Route("")
*/
class SecurityController extends Controller
{
    /**
    * @Route("login", name="_login")
    * @Template()
    *
    * @return Response
    */
    public function loginAction()
    {
        [...]
    }
   /**
    * @Route("login", name="_login_check")
    * @Template()
    *
    * @return Response
    */
    public function securityCheckAction()
    {
    }
    [...]

Como vemos en el ejemplo ya no utilizamos paths, sino que utilizamos el nombre que hemos asignado en el controlador, que mediante anotaciones en los comentarios realiza la configuración de routing.  De esta forma funciona correctamente con los diferentes idiomas que utilicemos en nuestra aplicación.

Bibliografia

 [] 2012 "Symfony en español" Capítulo Seguridad (Castellano) Traducido por Nacho Pacheco 
 [] 2011 "Stackoverflow" post (Inglés)

0 comentarios:

Publicar un comentario