Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Formulario login error

20 de octubre de 2013

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

#1

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

20 octubre 2013, 22:55