Les sessions sous Symfony 6

Symfony fournit un objet de session et plusieurs utilitaires que vous pouvez utiliser pour stocker des informations sur l’utilisateur entre les requêtes.

Configuration des sessions Symfony 6

Les sessions sont fournies par le composant HttpFoundation, qui est inclus dans toutes les applications Symfony, peu importe comment vous l’avez installé. Avant d’utiliser les sessions, vérifiez leur configuration par défaut :

# config/packages/framework.yaml
framework:
    session:
        # enables the support of sessions in the app
        enabled: true
        # ID of the service used for session storage.
        # NULL means that Symfony uses PHP default session mechanism
        handler_id: null
        # improves the security of the cookies used for sessions
        cookie_secure: 'auto'
        cookie_samesite: 'lax'

Mettre l’option de configuration handler_id à null signifie que Symfony utilisera le mécanisme de session PHP natif. Les fichiers de métadonnées de session seront stockés en dehors de l’application Symfony, dans un répertoire contrôlé par PHP. Bien que cela simplifie généralement les choses, certaines options liées à l’expiration de la session peuvent ne pas fonctionner comme prévu si d’autres applications qui écrivent dans le même répertoire ont des paramètres de durée de vie maximale courte.

Si vous préférez, vous pouvez utiliser le service session.handler.native_file comme handler_id pour laisser Symfony gérer les sessions lui-même. Une autre option utile est save_path, qui définit le répertoire où Symfony stockera les fichiers de métadonnées de session :

# config/packages/framework.yaml
framework:
    session:
        # ...
        handler_id: 'session.handler.native_file'
        save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'

Consultez la référence Symfony config pour en savoir plus sur les autres options de configuration de session disponibles. Vous pouvez également stocker les sessions dans une base de données.

Les bases des sessions avec Symfony 6

La session est disponible à travers la requête et la RequestStack. Symfony fournit un service request_stack qui est injecté dans vos services et contrôleurs si vous tapez un argument avec RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

class SomeService
{
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public function someMethod()
    {
        $session = $this->requestStack->getSession();

        // stores an attribute in the session for later reuse
        $session->set('attribute-name', 'attribute-value');

        // gets an attribute by name
        $foo = $session->get('foo');

        // the second argument is the value returned when the attribute doesn't exist
        $filters = $session->get('filters', []);

        // ...
    }
}

Les attributs stockés restent dans la session pour le reste de la session de l’utilisateur. Par défaut, les attributs de session sont des paires clé-valeur gérées avec la classe AttributeBag.

Évitez de lancer des sessions pour les utilisateurs anonymes

Les sessions sont automatiquement lancées dès que vous lisez, écrivez ou même vérifiez l’existence de données dans la session. Cela peut nuire aux performances de votre application car tous les utilisateurs recevront un cookie de session. Afin d’éviter cela, vous devez éviter complètement d’accéder à la session.