Quand on développe une application Symfony “classique” avec Twig et des formulaires, la session est omniprésente : elle gère l’authentification, les flash messages, etc.
Mais dès qu’on passe à une API REST ou GraphQL, continuer à utiliser la session PHP devient un piège.
Dans cet article, on va voir pourquoi la session pose problème dans une API Symfony, et comment s’en passer.
Symfony utilise le mécanisme standard de PHP : lorsqu’une requête démarre la session ($request->getSession()
ou utilisation implicite de Security
), PHP verrouille le fichier de session.
Ce verrou n’est libéré qu’à la fin de la requête (ou après un save()
/session_write_close()
).
👉 Conséquence : si un client envoie plusieurs appels en parallèle vers ton API (ex. chargement d’un tableau de bord avec 5 widgets), les requêtes s’exécutent les unes après les autres.
Cela provoque :
#[Route('/api/status', name: 'api_status')]
public function __invoke(Request $request): JsonResponse
{
// Accès à la session = déclenche le verrou !
$foo = $request->getSession()->get('foo');
// …
return new JsonResponse(['ok' => true]);
}
Avec plusieurs requêtes concurrentes → elles seront exécutées en file indienne.
Une API REST (et par extension une API Symfony) doit être sans état (stateless).
Chaque requête doit contenir toutes les infos nécessaires à son traitement (authentification, contexte métier).
En utilisant la session :
“The session has been started after headers have already been sent.”
Dans config/packages/security.yaml
:
security:
firewalls:
api:
pattern: ^/api
stateless: true # <--- essentiel
provider: app_user_provider
# authenticator, etc.
Avec stateless: true
, Symfony ne démarre pas la session pour ce firewall.
Authorization: Bearer <token>
.Même en lecture seule, ça déclenche le verrou.
Si tu dois vraiment lire une valeur (cas legacy), ferme immédiatement :
$val = $request->getSession()->get('foo');
$request->getSession()->save(); // libère le verrou
⚠️ Mais le mieux reste de ne jamais accéder à la session.
stateless: true
et baser ton auth sur des tokens (JWT, OAuth2).Conclusion
Si tu construis une API avec Symfony, retiens cette règle d’or :
➡️ Pas de session dans les API.
Utilise des tokens pour l’authentification et garde la session pour les applis web classiques où c’est encore pertinent.