Dans les versions antérieures de PHP, session_register_shutdown () était une fonction importante pour s'assurer que les données de session peuvent être enregistrées correctement à la fin du script. Sa fonction principale est d'appeler automatiquement session_write_close () à la fin du cycle de vie du script pour rédiger des données de $ _Session au stockage de session côté serveur.
Cependant, cette opération de session de bas niveau est-elle nécessaire lors de l'utilisation de cadres modernes tels que Symfony? Cet article discutera de cette question conjointement avec l'architecture de Symfony et le développement du langage PHP et proposera une alternative plus élégante.
Dans les applications PHP traditionnelles, nous rencontrons souvent les usages suivants:
session_start();
session_register_shutdown();
// installation session données
$_SESSION['user'] = 'Alice';
Le but de cela est de sauver automatiquement l'état de session à la fin de l'exécution du script, empêchant les données d'être écrites dans certains cas (comme le script quitte anormalement ou oublie d'appeler session_write_close () ). Cependant, cette approche expose également certains problèmes de conception, tels que le couplage excessif avec le code de la couche d'application et une dépendance excessive à l'égard de l'état mondial.
Symfony adopte un mécanisme de gestion de session plus moderne et abstrait. Par défaut, il utilise SessionInterface pour donner accès à la session et gère automatiquement le cycle de vie de la session via les auditeurs d'événements et les conteneurs de service.
L'utilisation de la session dans un contrôleur Symfony typique est la suivante:
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
public function example(Request $request, SessionInterface $session)
{
$session->set('user', 'Alice');
return $this->render('example.html.twig');
}
Symfony appellera automatiquement session_write_close () après le traitement de la demande, sans avoir besoin d'une intervention manuelle par le développeur. Cela signifie que l'utilisation de session_register_shutdown () dans Symfony n'est pas seulement inutile, mais rompt également le cadre du cycle de vie de la session.
Dans Symfony, le cadre peut être entièrement fiable pour gérer automatiquement l'initialisation et la fermeture des sessions. Les pratiques plus recommandées comprennent:
Injection de dépendance Session Interface : L'utilisation de la session par injection de dépendance peut assurer sa bonne initialisation et son nettoyage dans le cycle de vie.
Gérer la configuration et le stockage avec le service de session : En configurant le gestionnaire de session de Symfony, vous pouvez stocker des sessions dans une base de données, Redis ou un stockage personnalisé pour améliorer les performances et la sécurité.
Étendre avec les auditeurs d'événements : Si vous avez vraiment besoin d'exécuter une logique avant les écritures de session, vous pouvez enregistrer un écouteur d'événements aux événements Kernel.terminate ou Kernel.Response .
Par exemple, un gestionnaire de session personnalisé peut être configuré dans framework.yaml par: