Maison > cadre php > Laravel > le corps du texte

Parlons du conteneur de services dans Laravel

藏色散人
Libérer: 2021-07-27 08:57:03
avant
2321 Les gens l'ont consulté

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);
Copier après la connexion
// 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;
Copier après la connexion

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');
Copier après la connexion

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();
});
Copier après la connexion

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);
    Copier après la connexion
  • 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');
      Copier après la connexion
    • 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'));
      });
      Copier après la connexion
      • array method

      $foo = $container->make('Foo');
      Copier après la connexion

      parse est marqué lié

        $bar = $container['Bar'];
        Copier après la connexion
      • 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();
        }
        Copier après la connexion

        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!

        Étiquettes associées:
        source:segmentfault.com
        Déclaration de ce site Web
        Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
        Tutoriels populaires
        Plus>
        Derniers téléchargements
        Plus>
        effets Web
        Code source du site Web
        Matériel du site Web
        Modèle frontal