Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Exemples d'injection de dépendances en PHP avec des composants Symfony

by
Difficulty:IntermediateLength:MediumLanguages:

French (Français) translation by Soleil (you can also view the original English article)

Dans cet article, nous examinerons quelques exemples d'utilisation du composant Symfony DependencyInjection. Vous apprendrez les bases de l'injection de dépendances, qui permettent un code plus propre et plus modulaire, et vous verrez comment l'utiliser dans votre application PHP avec le composant Symfony.

Qu'est-ce que le composant Symfony DependencyInjection?

Le composant Symfony DependencyInjection fournit une méthode standard pour instancier des objets et gérer la gestion des dépendances dans vos applications PHP. Le cœur du composant DependencyInjection est un conteneur qui contient tous les services disponibles dans l'application.

Pendant la phase de démarrage de votre application, vous êtes censé enregistrer tous les services de votre application dans le conteneur. À un stade ultérieur, le conteneur est chargé de créer les services requis. Plus important encore, le conteneur est également responsable de la création et de l’injection de dépendances des services.

L'avantage de cette approche est que vous n'avez pas à coder en dur le processus d'instanciation des objets car les dépendances seront détectées et injectées automatiquement. Cela crée un couplage lâche entre les parties de votre application.

Dans cet article, nous allons explorer comment vous pouvez libérer la puissance du composant DependencyInjection. Comme d'habitude, nous commencerons par les instructions d'installation et de configuration et nous implémenterons quelques exemples concrets pour démontrer les concepts clés.

Installation et configuration

Dans cette section, nous allons installer le composant DependencyInjection. Je suppose que vous avez déjà installé Composer dans votre système car nous en aurons besoin pour installer le composant DependencyInjection disponible sur Packagist.

Alors, allez-y et installez le composant DependencyInjection à l'aide de la commande suivante.

Cela aurait dû créer le fichier composer.json, qui devrait ressembler à ceci:

Nous allons également installer quelques autres composants qui seront utiles dans nos exemples.

Si vous voulez charger des services à partir d'un fichier YAML au lieu de le définir dans le code PHP, c'est le composant Yaml qui vient en aide car il vous aide à convertir les chaînes YAML en types de données compatibles PHP et vice versa.

Enfin, nous allons installer le composant Config qui fournit plusieurs classes d'utilitaires pour initialiser et gérer les valeurs de configuration définies dans différents types de fichiers tels que YAML, INI et XML. Dans notre cas, nous l'utiliserons pour charger des services à partir du fichier YAML.

Modifions le fichier composer.json pour qu'il ressemble au suivant.

Comme nous avons ajouté une nouvelle entrée classmap, allons-y et mettons à jour l'autoloader du composeur en exécutant la commande suivante.

Maintenant, vous pouvez utiliser l'espace de noms Services pour charger automatiquement les classes sous le répertoire src.

Donc, c'est la partie installation, mais comment est-ce que vous êtes censé l'utiliser? En fait, il suffit d'inclure le fichier autoload.php créé par Composer dans votre application, comme illustré dans l'extrait suivant.

Comment travailler avec un conteneur

Dans cette section, nous allons passer en revue un exemple pour montrer comment vous pouvez injecter des services dans un conteneur. Un conteneur doit agir comme un référentiel central contenant tous les services de votre application. Plus tard, nous pourrions utiliser le conteneur pour récupérer des services si nécessaire.

Pour commencer, allons-y et définissons un service assez basique sur src / DemoService.php avec les contenus suivants.

C'est un service très simple qui implémente la méthode helloWorld pour le moment.

Ensuite, continuez et créez le fichier basic_container.php avec le contenu suivant dans la racine de votre application.

Pour commencer, nous avons initialisé l'objet ContainerBuilder avec le constructeur new ContainerBuilder(). Ensuite, nous avons utilisé la méthode register de l'objet ContainerBuilder pour injecter notre service personnalisé \Services\DemoService dans le conteneur. Le demo.service agit comme un alias de notre service.

Enfin, nous avons utilisé la méthode get de l'objet ContainerBuilder pour récupérer notre service à partir du conteneur et l'utiliser pour appeler la méthode helloWorld.

C'était donc une démonstration de base de la façon de travailler avec un conteneur. Dans la section suivante, nous allons étendre cet exemple pour explorer comment les dépendances de classes sont résolues à l'aide d'un conteneur.

Un exemple concret

Dans cette section, nous allons créer un exemple qui montre comment les dépendances de classe sont résolues à l'aide du composant DependencyInjection.

Pour le démontrer, nous allons créer un nouveau service DependentService qui requiert le service DemoService, créé dans la section précédente, en tant que dépendance. Ainsi, nous verrons comment le service DemoService est automatiquement injecté en tant que dépendance lorsque le service DependentService est instancié.

Allez-y et créez le fichier src/DependentService.php avec le contenu suivant pour définir le service DependentService.

Comme vous pouvez le voir, le service \Services\ DemoService est requis pour instancier le service DependentService.

Ensuite, continuez et créez le fichier di_container.php avec le contenu suivant.

Nous utilisons la même méthode register pour injecter notre service personnalisé \Services\DependentService dans le conteneur.

En outre, nous avons également utilisé la méthode addArgument pour informer le conteneur de la dépendance du service DependentService. Nous avons utilisé la classe Reference pour informer le conteneur qu'il doit injecter le service demo.service lorsque le service dependent.service est initialisé. De cette façon, une dépendance est automatiquement injectée au besoin!

Enfin, nous avons utilisé la méthode get de l'objet ContainerBuilder pour extraire le service dependent.service de l'objet ContainerBuilder et l'utiliser pour appeler la méthode helloWorld.

De cette manière, le composant DependencyInjection fournit un moyen standard d’instancier des objets et d’injecter des dépendances dans votre application.

Comment charger dynamiquement des services à l'aide du fichier YAML

Dans cette dernière section, nous explorerons comment vous pouvez charger dynamiquement des services à partir du fichier YAML. Fondamentalement, nous mettrons à jour l'exemple présenté dans la section précédente.

En plus du composant DependencyInjection, nous aurons également besoin de deux autres composants Symfony pour implémenter l'exemple YAML: Config et Yaml. Rappelez-vous que nous avons déjà installé ces deux composants dans la section Installation and Configuration avec le composant DependencyInjection lui-même. Nous sommes donc prêts à partir!

Allez-y et créez le fichier services.yaml avec le contenu suivant dans la racine de votre application.

Comme vous pouvez le voir, il est assez simple de définir des services en utilisant la syntaxe YAML. Pour définir les dépendances de votre service, vous devez utiliser la clé arguments.

Ensuite, continuez et créez le fichier di_yaml_container.php avec le contenu suivant.

Tout est à peu près pareil sauf que nous chargeons des services à partir du fichier services.yaml au lieu de le définir dans le code PHP lui-même. Cela permet de définir dynamiquement les dépendances de l'application.

Conclusion

Le composant Symfony DependencyInjection a occupé une place centrale dans ce tutoriel. Nous avons vu comment installer et configurer DependencyInjection, ainsi que des exemples concrets d'utilisation.

Je suis vraiment fasciné et excité par les composants découplés du framework Symfony que vous pouvez choisir pour votre application. Branchez-les dans votre code et ils fonctionnent! Globalement, je ne peux que constater les avantages de cette nouvelle approche-cadre pour notre communauté PHP!

Partagez vos pensées et suggestions en utilisant le flux ci-dessous. J'aimerais discuter avec vous plus loin!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.