{% extends 'base.html.twig' %} {# ══════════════════════════════════════════════════════════════════ Template de connexion — security/login.html.twig ══════════════════════════════════════════════════════════════════ Page de connexion autonome : aucune sidebar ni topbar ne s'affiche (app.user est null → les blocs conditionnels de base.html.twig sont ignorés). Fonctionnement du formulaire : - Action : POST vers app_login (check_path = app_login) - Identifiant : champ _username (mapped sur User::email) - Mot de passe : champ _password - CSRF : token 'authenticate' (stateless, signé par APP_SECRET) - Remember-me : case _remember_me (cookie 7 jours, httponly, SameSite=Lax) Gestion des erreurs : $error est injecté par SecurityController::login() via AuthenticationUtils::getLastAuthenticationError(). Le message est traduit via le domaine 'security'. Styles : Tous les styles sont déclarés en ligne dans le bloc body (pas de fichier CSS dédié) pour garder la page autonome. Palette : vert #79b92c (bouton, focus, accent), gris clair (fond). ══════════════════════════════════════════════════════════════════ #} {% block title %}Connexion{% endblock %} {% block body %} {# Carte centrée sur fond gris — occupe toute la hauteur de l'écran #}
{# En-tête : logo + sous-titre de l'application #} {% if error %} {# Message d'erreur traduit depuis le domaine 'security' de Symfony #}
{{ error.messageKey|trans(error.messageData, 'security') }}
{% endif %}
{# Jeton CSRF stateless signé par APP_SECRET — protège contre les attaques CSRF #}
{% endblock %}