Laravel Service Container documentation Comme vous pouvez le constater, son rôle est de nous aider à gérer et à réaliser l'injection de dépendances. Dans "Injection de dépendances", nous avons vu que l'utilisation de l'injection de dépendances peut réduire considérablement le couplage du code, mais elle présente également un inconvénient, c'est-à-dire que vous devez gérer vous-même les objets injectés. Si un composant a de nombreuses dépendances, nous devons créer une méthode setter avec plusieurs paramètres pour transmettre les dépendances, ou créer un constructeur avec plusieurs paramètres pour les transmettre. De plus, nous devons créer des dépendances à chaque fois avant d'utiliser le composant, ce qui est nécessaire. rend notre code n'est pas facile à maintenir comme ça.
Donc, fournir un conteneur (Service Container) pour les instances dépendantes est une méthode pratique et élégante.
Par exemple, voici le fichier d'entrée de laravel (les commentaires ont été supprimés) :
Ensuite, les trois méthodes singleton suivantes définissent quel singleton de classe est injecté en s'appuyant sur les trois interfaces
, et . Ensuite, regardez
, la méthode make utilise en fait Service Container pour créer une nouvelle instance
La différence avec l'ordinaire new est que ses dépendances y seront automatiquement injectées. bootstrap/app.php$appN'est-ce pas très simple ? IlluminateFoundationApplicationIlluminateFoundationApplicationEn fait, non seulement Laravel, mais aussi des frameworks tels que Yii2 et Phalcon gèrent tous l'injection de dépendances en implémentant des conteneurs. $app Comment utiliser Service ContainerIlluminateContractsHttpKernelIlluminateContractsConsoleKernelPuisqu'il s'agit d'un conteneur, ce n'est rien de plus que deux choses, mettre des choses dedans et retirer des choses. Les celles correspondantes pour Service Container sont contraignantes et résolues. IlluminateContractsDebugExceptionHandler Obtenir le conteneurpublic/index.phpIlluminateContractsHttpKernelDans le fournisseur de services de Laravel, vous pouvez obtenir le conteneur via
De plus, vous pouvez également utiliser
pour obtenir le conteneur.
Si vous utilisez Service Container en dehors de Laravel, créez-en simplement un nouveau
et vous obtiendrez le conteneur.
$container est utilisé ci-dessous pour représenter le conteneur obtenu. La méthode Binding renvoie une instance de l'interface. renverra la même instance du conteneur :
//使用闭包
$container->bind('BarInterface', function(){
return new Bar();
});
//或者使用字符串
$container->bind('FooInterface', 'Foo');
Bind instance
$this->appapp() IlluminateContainerContainerVous pouvez également utiliser la méthode instance pour lier une instance d'objet existante au conteneur. Les appels suivants renverront l'instance spécifiée à partir du conteneur :
$container->singleton('BarInterface', function(){
return new Bar();
});
Liaison de contexte
Parfois, vous pouvez avoir deux classes utilisant la même interface, mais vous souhaitez que chaque classe puisse injecter des tâches différentes.
$bar = new Bar();
$bar->setSomething(new Something);
$container->instance('Bar', $bar);
mark
Parfois, vous devrez peut-être analyser toutes les liaisons dans une certaine "catégorie".
$container->bind('Father', function () {
//
});
$container->bind('Mother', function () {
//
});
$container->bind('Daughter', function () {
//
});
$container->bind('Son', function () {
//
});
$container->tag(['Father', 'Mother', 'Daughter', 'Son'], 'familyMembers');
$container->bind('Family', function ($container) {
return new Family($container->tagged('familyMembers'));
});
array method
$foo = $container->make('Foo');
parse est marqué lié
$bar = $container['Bar'];
parse event
Chaque fois que le conteneur de service résout un objet L'événement sera déclenché. Vous pouvez écouter cet événement en utilisant la méthode de résolution.
$familyMembers = $container->tagged('familyMembers');
foreach ($familyMembers as $inpidual) {
$inpidual->doSomething();
}
Recommandations associées :
Les cinq derniers didacticiels vidéo Laravel
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!