22/01/2023

1. Conteneur de services

Lu 361 fois Licence Creative Commons

Service

Comme son nom l'indique, le conteneur de services (ou service container) contient des... services.
Un service est simplement un objet PHP. Dans une application Symfony, les classes sont stockées dans le dossier /src/ et sont -presque- toutes considérées comme des services.
Le terme de service s'applique également à d'autres classes PHP provenant des packages installés.

Lorsque l'on aura besoin d'un service quelque part dans l'application, il sera "injecté" par le conteneur de services.

Nous verrons un peu plus tard comment injecter un service selon le principe d'injection de dépendance.

Composant

Symfony propose bien plus que son framework, dont des composants.
Derrière ce terme se cachent en réalité des packages, des librairies autonomes et indépendantes du framework. Par exemple le composant Console qui est déjà installé dans notre application permet de créer des applications CLI. Il est possible de l'utiliser sans le framework, c'est notamment le cas de Composer !

La liste des composants Symfony est très longue, mais retenons simplement que ce sont des packages qui peuvent particulièrement bien s'intégrer au framework.

Bundle

Les bundles pourraient être comparés à des plugins: ce sont des packages qui vont apporter des fonctionnalités supplémentaires à votre application. N'importe qui peut créer un bundle.

Le puissant système de bundles permet à un package de se brancher au conteneur de service pour configurer les services qu'il souhaite mettre à disposition. Par exemple, un bundle peut indiquer que l'une de ses classes est une commande qu'il faut ajouter à la console de l'application, elle sera ensuite disponible à l'exécution de bin/console.

Les bundles peuvent également générer dynamiquement des services en fonction de leur configuration.
Imaginons que nous voulions utiliser un service pour récupérer des utilisateurs dans une base de données. Ce service aura besoin de savoir quel est le type de la base, son adresse, les identifiants, etc. Un bundle fourni généralement des paramètres de configuration à partir de quoi générer des services.

Service Container

Le conteneur de services va donc lire la configuration des services de l'application ainsi que celle des bundles pour savoir comment nous fournir les services appropriés.
Le conteneur de services de Symfony est compilé: son code est stocké dans /var/cache. À chaque changement dans la configuration il sera regénéré.

Le fait qu'il soit compilé a des avantages sur la performance: la logique de configuration d'un service n'est pas "calculée" au runtime, mais à l'avance.

Voyons maintenant comment est organisée la configuration de l'application.