In Laravel ist der Service-Container ein leistungsstarkes Tool zum Verwalten von Klassenabhängigkeiten und zum Implementieren der Abhängigkeitsinjektion. Wenn eine Anwendung einen bestimmten Dienst verwenden muss, löst der Dienstcontainer den Dienst auf, löst automatisch die Abhängigkeiten zwischen Diensten auf und übergibt ihn dann zur Verwendung an die Anwendung.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, Laravel 6-Version, Dell G3-Computer.
Was ist ein Service-Container?
Der Laravel-Service-Container ist ein leistungsstarkes Tool zum Verwalten von Klassenabhängigkeiten und zum Implementieren der Abhängigkeitsinjektion. Der Begriff „Abhängigkeitsinjektion“ mag auf den ersten Blick schick aussehen, im Wesentlichen bedeutet er jedoch das „Injizieren“ von Klassenabhängigkeiten in eine Klasse über den Konstruktor oder in einigen Fällen über die „Setter“-Methode.
Funktionsmodule in Laravel wie Route, Eloquent ORM, Request, Response usw. werden tatsächlich von Klassenmodulen bereitgestellt, die nichts mit dem Kern zu tun haben. Diese Klassen werden von uns tatsächlich von der Registrierung bis zur Instanziierung verwendet Behälter mit Laravel, der dafür verantwortlich ist.
Es gibt zwei Konzepte im Service-Container控制反转(IOC)
和依赖注入(DI)
:
Abhängigkeitsinjektion und Umkehrung der Kontrolle sind unterschiedliche Beschreibungen derselben Sache und sie beschreiben sie aus unterschiedlichen Perspektiven. Die Abhängigkeitsinjektion wird aus der Perspektive der Anwendung beschrieben. Die Anwendung ist darauf angewiesen, dass der Container die benötigten externen Ressourcen erstellt und injiziert. Die Umkehrung der Kontrolle wird aus der Perspektive des Containers beschrieben. Der Container steuert die Anwendung, und der Container injiziert umgekehrt die von der Anwendung benötigten externen Ressourcen.
In Laravel bindet das Framework verschiedene integrierte Dienste an den Service-Container. Wir können auch benutzerdefinierte Dienste an den Container binden. Wenn eine Anwendung einen bestimmten Dienst verwenden muss, löst der Dienstcontainer den Dienst auf, löst automatisch die Abhängigkeiten zwischen Diensten auf und übergibt ihn dann zur Verwendung an die Anwendung.
Lassen Sie uns besprechen, wie Servicebindung und -analyse in Laravel implementiert werden.
Dienstbindung
Zu den häufig verwendeten Methoden zum Binden von Diensten an Container gehören Instanz, Bindung, Singleton und Alias. Schauen wir sie uns einzeln an.
Instanz
Bindet ein vorhandenes Objekt an den Dienstcontainer. Wenn der Dienst anschließend nach Namen aufgelöst wird, gibt der Container immer die gebundene Instanz zurück.
$api = new HelpSpot\API(new HttpClient); $this->app->instance('HelpSpot\Api', $api);
registriert das Objekt im Attribut $instnces des Service-Containers.
[ 'HelpSpot\Api' => $api//$api是API类的对象,这里简写了 ]
$this->app->bind('HelpSpot\API', null);
$this->app->bind('HelpSpot\API', function () { return new HelpSpot\API(); });//闭包直接提供类实现方式 $this->app->bind('HelpSpot\API', function ($app) { return new HelpSpot\API($app->make('HttpClient')); });//闭包返回需要依赖注入的类
$this->app->bind('Illuminate\Tests\Container\IContainerContractStub', 'Illuminate\Tests\Container\ContainerImplementationStub');
bind registriert den Dienst wie folgt im $bindings-Attribut des Dienstcontainers:
public function bind($abstract, $concrete = null, $shared = false) { $abstract = $this->normalize($abstract); $concrete = $this->normalize($concrete); //如果$abstract为数组类似['Illuminate/ServiceName' => 'service_alias'] //抽取别名"service_alias"并且注册到$aliases[]中 //注意:数组绑定别名的方式在5.4中被移除,别名绑定请使用下面的alias方法 if (is_array($abstract)) { list($abstract, $alias) = $this->extractAlias($abstract); $this->alias($abstract, $alias); } $this->dropStaleInstances($abstract); if (is_null($concrete)) { $concrete = $abstract; } //如果只提供$abstract,则在这里为其生成concrete闭包 if (! $concrete instanceof Closure) { $concrete = $this->getClosure($abstract, $concrete); } $this->bindings[$abstract] = compact('concrete', 'shared'); if ($this->resolved($abstract)) { $this->rebound($abstract); } } protected function getClosure($abstract, $concrete) { // $c 就是$container,即服务容器,会在回调时传递给这个变量 return function ($c, $parameters = []) use ($abstract, $concrete) { $method = ($abstract == $concrete) ? 'build' : 'make'; return $c->$method($concrete, $parameters); }; }
$bindings = [ 'HelpSpot\API' => [//闭包绑定 'concrete' => function ($app, $paramters = []) { return $app->build('HelpSpot\API'); }, 'shared' => false//如果是singleton绑定,这个值为true ] 'Illuminate\Tests\Container\IContainerContractStub' => [//接口实现绑定 'concrete' => 'Illuminate\Tests\Container\ContainerImplementationStub', 'shared' => false ] ]
singleton Die Methode ist eine Variante der Bind-Methode. Sie bindet eine Klasse oder Schnittstelle, die nur benötigt wird Wird einmal in den Container analysiert und anschließend wird dieselbe Instanz zurückgegeben, wenn der Container den Dienst aufruft Durch die oben erwähnte Bindungsmethode wird der Dienst registriert. Die entsprechende Beziehung zwischen Aliasnamen und Dienstklassen wird im Attribut $aliases des Dienstcontainers registriert.
Zum Beispiel:
public function singleton($abstract, $concrete = null) { $this->bind($abstract, $concrete, true); }
Nachdem Sie den Dienst gebunden haben, können Sie das Dienstobjekt bei der Verwendung über
public function alias($abstract, $alias) { $this->aliases[$alias] = $this->normalize($abstract); }
analysieren. Auf diese Weise müssen Sie beim Erstellen keine längeren Klassennamen schreiben make-Methode ist besser.
Service-Analyse
make: Analysieren Sie das Serviceobjekt aus dem Service-Container. Diese Methode empfängt den Klassennamen oder Schnittstellennamen, den Sie analysieren möchten, als Parameter. $this->app->alias('\Illuminate\ServiceName', 'service_alias');
$this->app->make('service_alias');
Der Service-Container ist der Kern von Laravel. Er löst für uns die gegenseitigen Abhängigkeiten zwischen Objekten und steuert auch die externe Übertragung um bestimmte Verhaltensweisen zu definieren (Route, Eloquent, das sind externe Module, sie definieren ihre eigenen Verhaltensspezifikationen, der Service-Container ist für diese Klassen von der Registrierung bis zur Instanziierung für Ihre Nutzung verantwortlich).
Damit eine Klasse von einem Container extrahiert werden kann, muss sie zunächst beim Container registriert werden. Da Laravel diesen Container als Service-Container bezeichnet, müssen wir, wenn wir einen Service benötigen, zuerst den Service registrieren und an den Container binden. Dann ist das Ding, das den Service bereitstellt und den Service an den Container bindet, der Service-Provider (ServiceProvider). Der Dienstanbieter ist hauptsächlich in zwei Teile unterteilt: Registrieren (Registrierung) und Booten (Booten, Initialisieren)
[Verwandte Empfehlungen:
Laravel-Video-Tutorial]
Das obige ist der detaillierte Inhalt vonWas ist ein Laravel-Servicecontainer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!