Heim  >  Artikel  >  PHP-Framework  >  Lassen Sie uns über Service Container in Laravel sprechen

Lassen Sie uns über Service Container in Laravel sprechen

藏色散人
藏色散人nach vorne
2021-07-26 15:53:462309Durchsuche

Was ist Service Container?

Der Laravel Service Container ist ein leistungsstarkes Tool zum Verwalten von Klassenabhängigkeiten und zur Durchführung der Abhängigkeitsinjektion.

Sie können die Erklärung des Service Containers vom Laravel-Beamten lesen Dokumentation Wie Sie sehen, besteht seine Aufgabe darin, uns bei der Verwaltung und Durchführung der Abhängigkeitsinjektion zu unterstützen.

Warum Service Container verwenden?

In „Abhängigkeitsinjektion“ haben wir gesehen, dass die Verwendung von Abhängigkeitsinjektion die Koppelung des Codes erheblich reduzieren kann, aber auch einen Nachteil mit sich bringt, nämlich dass Sie die injizierten Objekte selbst verwalten müssen.
Wenn eine Komponente viele Abhängigkeiten hat, müssen wir eine Setter-Methode mit mehreren Parametern erstellen, um die Abhängigkeiten zu übergeben, oder einen Konstruktor mit mehreren Parametern erstellen, um sie zu übergeben. Darüber hinaus müssen wir jedes Mal Abhängigkeiten erstellen, bevor wir die Komponente verwenden Dadurch ist unser Code nicht einfach zu warten.
Die Bereitstellung eines Containers (Service Container) für abhängige Instanzen ist daher eine praktische und elegante Methode.
Das Folgende ist zum Beispiel die Eintragsdatei von Laravel (Kommentare wurden entfernt):

// 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;

Schauen Sie sich zunächst bootstrap/app.php an, wobei $app IlluminateFoundationApplicationEine Instanz der Klasse, und die Klasse IlluminateFoundationApplication erbt vom Container, sodass $app eigentlich ein Service-Container ist. bootstrap/app.php,其中$appIlluminateFoundationApplication的一个实例,而IlluminateFoundationApplication类继承自Container,所以$app实际上就是一个Service Container。
然后下面的三个singleton方法定义了当依赖IlluminateContractsHttpKernelIlluminateContractsConsoleKernelIlluminateContractsDebugExceptionHandler这三个接口时,注入哪个类的单例。
然后看public/index.php,其中的make方法实际上就是用Service Container来new一个IlluminateContractsHttpKernel实例,跟普通new的区别就是会把他的依赖自动注入进去。

是不是很简洁?

其实不单是Laravel,像Yii2、Phalcon等框架都通过实现容器来管理依赖注入。

如何使用Service Container

既然是一个容器,无非就是两个事,往里放东西和往外取东西,对应到Service Container就是绑定(Binding)和解析(Resolving)。

获得容器

在Laravel的Service Provider中,可以通过$this->app获取容器,除此之外,还可以使用app()来获取容器。
如果在Laravel外使用Service Container,直接new一个IlluminateContainerContainerDann definieren die folgenden drei Singleton-Methoden, welche Singleton-Klasse eingefügt werden soll, wenn sie sich auf die drei Schnittstellen IlluminateContractsHttpKernel, IlluminateContractsConsoleKernel, IlluminateContractsDebugExceptionHandler verlassen.

Dann schauen Sie sich public/index.php an. Die make-Methode verwendet tatsächlich den Service Container, um eine neue IlluminateContractsHttpKernel-Instanz zu erstellen Automatisch eingespritzt.

Ist es nicht ganz einfach?

Tatsächlich verwalten nicht nur Laravel, sondern auch Frameworks wie Yii2 und Phalcon die Abhängigkeitsinjektion durch die Implementierung von Containern.
  • So verwenden Sie einen Service-Container

    Da es sich um einen Container handelt, sind es nichts weiter als zwei Dinge: das Einlegen und Herausnehmen von Dingen. Die entsprechenden Dinge für den Service-Container sind bindend und lösend.
Holen Sie sich den Container
  • Im Laravel-Dienstanbieter können Sie den Container über $this->app abrufen. Darüber hinaus können Sie auch app() Get verwenden Der Behälter.

    Wenn Sie Service Container außerhalb von Laravel verwenden, erstellen Sie einfach einen neuen IlluminateContainerContainer, um den Container zu erhalten.

  • $container wird unten verwendet, um den erhaltenen Container darzustellen.
Binding

    Binding gibt eine Instanz der Schnittstelle zurück gibt dieselbe Instanz aus dem Container zurück:
  • //使用闭包
    $container->bind('BarInterface', function(){
        return new Bar();
    });
    //或者使用字符串
    $container->bind('FooInterface', 'Foo');
Instanz binden

    Sie können die Instanzmethode auch verwenden, um eine vorhandene Objektinstanz an den Container zu binden. Nachfolgende Aufrufe geben die angegebene Instanz aus dem Container zurück:
  • $container->singleton('BarInterface', function(){
        return new Bar();
    });
Kontextbindung

    Manchmal haben Sie möglicherweise zwei Klassen, die dieselbe Schnittstelle verwenden, aber Sie möchten, dass jede Klasse unterschiedliche Ergebnisse einbringen kann.
  • $bar = new Bar();
    $bar->setSomething(new Something);
    
    $container->instance('Bar', $bar);
mark

Manchmal müssen Sie möglicherweise alle Bindungen unter einer bestimmten „Kategorie“ analysieren.

    $container->when('Man')
              ->needs('PartnerInterface')
              ->give('Woman');
    $container->when('Woman')
              ->needs('PartnerInterface')
              ->give('Man');
  • parse

  • make-Methode
    • $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-Methode
    • $foo = $container->make('Foo');
    parse ist markiert.bound

    $bar = $container['Bar'];

    Parse-Ereignis

    Immer wenn der Service-Container ein Objekt auflöst. Das Ereignis wird ausgelöst. Sie können dieses Ereignis mithilfe der Auflösungsmethode abhören.

    $familyMembers = $container->tagged('familyMembers');
    
    foreach ($familyMembers as $inpidual) {
        $inpidual->doSomething();
    }

    Verwandte Empfehlungen:
    Die neuesten fünf Laravel-Video-Tutorials
    🎜🎜🎜

    Das obige ist der detaillierte Inhalt vonLassen Sie uns über Service Container in Laravel sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen