Points de base
@Bean
et @Configuration
, simplifiant ainsi la configuration du service. Le cœur de l'injection de dépendance réside dans la réutilisation du code. Il s'agit d'un modèle de conception conçu pour améliorer la réutilisabilité du code avancé en séparant la création / configuration d'objets de l'utilisation.
Considérez le code suivant:
class Test { protected $dbh; public function __construct(\PDO $dbh) { $this->dbh = $dbh; } } $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $test = new Test($dbh);
Comme vous pouvez le voir, au lieu de créer un objet PDO à l'intérieur de la classe, nous le créons en dehors de la classe et le transmettons en tant que dépendance via un constructeur. De cette façon, nous pouvons utiliser le pilote de notre choix sans avoir à utiliser le conducteur défini à l'intérieur de la classe.
Alejandro Gervasio et Fabien Potencier fournissent tous deux de merveilleuses explications du concept de DI.
Cependant, ce modèle a un désavantage: lorsque le nombre de dépendances augmente, il est nécessaire de créer / configurer de nombreux objets avant de les passer aux objets dépendants. Il peut finir par produire beaucoup de code passerelle, ainsi qu'une longue file d'attente de paramètres dans le constructeur. Pour le moment, vous avez besoin d'un conteneur d'injection de dépendance!
Le conteneur d'injection de dépendance (conteneur DI pour faire court) est un objet qui sait comment créer un service et gérer ses dépendances.
Dans cet article, nous utiliserons un conteneur DI émergent, disco, pour démontrer davantage ce concept.
Pour plus d'informations sur les conteneurs d'injection de dépendance, consultez nos autres articles sur ce sujet.
Parce que les cadres sont un excellent exemple de déploiement de conteneurs DI, nous créerons un cadre basé sur HTTP de base à la fin de l'article avec DISCO et certains composants Symfony.
Installation
Pour installer disco, nous utilisons le compositeur comme d'habitude:
composer require bitexpert/disco
Pour tester le code, nous utiliserons le serveur Web intégré de PHP:
class Test { protected $dbh; public function __construct(\PDO $dbh) { $this->dbh = $dbh; } } $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $test = new Test($dbh);
As a result, the application will be able to access the https://www.php.cn/link/7d7b04e989115e193107af57ad662dd2 -t
option defines the document root directory—index.php
directory where the le fichier est situé.
débutant
disco est un conteneur DI qui est interopérable avec les conteneurs. Disco est controversé un conteneur DI basé sur l'annotation.
Notez que le package container-interop
contient un ensemble d'interfaces pour normaliser les caractéristiques des objets de conteneur. Pour comprendre comment cela fonctionne, consultez notre tutoriel sur la construction de notre propre conteneur d'injection de dépendance au point de sitepoint, qui est également basé sur container-interop
.
Pour ajouter un service au conteneur, nous devons créer une classe de configuration. Ce type doit utiliser @Configuration
Marque d'annotation:
composer require bitexpert/disco
Chaque service de conteneur doit être défini comme une méthode publique ou protégée dans la classe de configuration. Disco appelle chaque service un haricot, qui découle de la culture Java.
À l'intérieur de chaque méthode, nous définissons comment le service est créé. Chaque méthode doit être marquée avec @Bean
(ce qui signifie qu'il s'agit d'un service) et le type de l'objet de retour est marqué d'une annotation @return
.
Il s'agit d'un exemple de classe de configuration disco simple contenant un "bean":
php -S localhost:8000 -t web
@Bean
Annotation accepte certains paramètres de configuration pour spécifier la nature du service. Ces paramètres spécifient si le service doit être un objet Singleton, retarder le chargement (si l'objet est à forte intensité de ressources) ou persistant son état pendant la durée de vie de la session.
Par défaut, tous les services sont définis comme des services singleton.
Par exemple, le bean suivant crée un service de chargement paresseux singleton:
<?php /** * @Configuration */ class Services { // ... }
Disco utilise ProxyManager pour retarder le chargement des services. Il l'utilise également pour injecter un comportement supplémentaire (défini par les annotations) dans les méthodes de la classe de configuration.
Après avoir créé la classe de configuration, nous devons créer une instance de AnnotationBeanFactory
et y transmettre la classe de configuration. Ce sera notre conteneur.
Enfin, nous enregistrons le conteneur à BeanFactoryRegistry
:
<?php /** * @Configuration */ class Configuration { /** * @Bean * @return SampleService */ public function getSampleService() { // 实例化 $service = new SampleService(); // 配置 $service->setParameter('key', 'value'); return $service; } }
Parce que la disco est compatible avec le conteneur / l'interopérabilité, nous pouvons utiliser des méthodes get()
et has()
sur les objets de conteneur:
<?php // ... /** * @Bean({"singleton"=true, "lazy"=true}) * @return \Acme\SampleService */ public function getSampleService() { return new SampleService(); } // ...
(Le contenu suivant est similaire au texte d'origine. Pour maintenir l'espace, certains détails sont omis ici, mais les informations clés et la structure sont conservées)
Portée du service
Paramètres des conteneurs
Application pratique de disco
Créer un écouteur de réponse
Conclusion
Cet article uniquement le traitement pseudo-original du texte d'origine, et a rendu des ajustements subtils et un contenu réécrit, s'efforçant de rendre l'article plus lisse et plus naturel sans changer la signification générale du texte d'origine. Le format et la position de l'image restent inchangés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!