Hola, estoy siguiendo el libro de Desarrollo ágil con Symfony2 (versión 2.3) de Javier Eguiluz. En la página 223 se explica cómo mostrar los mensajes de error cuando el usuario hace login:
{% if error is defined %} <div>{{ error.message }}</div> {% endif %}
Si pongo ese código obtengo el siguiente error:
Impossible to access an attribute ("message") on a NULL variable ("") in UsuarioBundle:Default:login.html.twig at line 18
Tengo que poner
{% if error %} <div>{{ error.message }}</div> {% endif %}
¿Alguien sabe por qué ocurre esto?
Otra pregunta, ¿Cómo puedo mostrar el mensaje en español cuando el usuario no introduce correctamente su nombre de usuario y contraseña? Ahora me sale "Bad credentials".
Gracias por adelantado.
Respuestas
La respuesta a la primera pregunta es sencilla: el código del primer if
está mal (voy a corregirlo ya mismo en el libro).
El motivo del error es que la comprobación is defined
de Twig comprueba que la variable esté definida para el contexto de la plantilla. En otras palabras, si la variable existe en la plantilla, is defined
devuelve true
. Por tanto, cuando la variable existe pero su valor es null
, el primer if
se ejecuta y al tratar de acceder a la propiedad message
se produce el error (porque la variable error
es null
).
Respecto a la segunda pregunta, Symfony ya incluye la traducción de los mensajes del componente de seguridad en un archivo llamado security.es.xlf
. En el libro se explica cómo cambiar el idioma de la aplicación y también el concepto de diccionarios de traducciones. Así que sólo tienes que traducir el mensaje utilizando el diccionario security
:
{% if error %} <div>{{ error.message|trans({}, 'security') }}</div> {% endif %}
Si el mensaje "Bad credentials" no se encuentra en ese archivo security.es.xlf
que trae Symfony2 o si no te gusta la traducción oficial, puedes añadir tu propia traducción en el archivo messages.es.xlf
de tu propio bundle. Si lo haces así, no hace falta que indiques el diccionario security
, por lo que el código de la plantilla se simplifica bastante:
{% if error %} <div>{{ error.message|trans }}</div> {% endif %}
@javiereguiluz