Maison  >  Article  >  cadre php  >  Parlons du conteneur de services dans Laravel

Parlons du conteneur de services dans Laravel

藏色散人
藏色散人avant
2021-07-26 15:53:462310parcourir

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) :
// public/index.php
<?php

require __DIR__.&#39;/../bootstrap/autoload.php&#39;;

$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);
// bootstrap/app.php
<?php

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.&#39;/../&#39;)
);

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

return $app;

Premier coup d'oeil à

, où
est une instance de

, et la classe

hérite de Container, donc

est en fait un conteneur de service .

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->when('Man')
                ->needs('PartnerInterface')
                ->give('Woman');
      $container->when('Woman')
                ->needs('PartnerInterface')
                ->give('Man');
    • parse

    • make method

      $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!

        Déclaration:
        Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer