Dienstleister
Dienstleister
Einführung
Der Dienstleister ist alles Beratungszentrum für Laravel-Anwendungen. Ihre Anwendung sowie die über den Server gebooteten Kerndienste von Laravel werden über Dienstanbieter gebootet.
Aber was bedeutet „Anleitung“? Normalerweise kann unsere Registrierung als Registrierung verstanden werden, z. B. als Registrierung von Service-Container-Bindungen, Ereignis-Listenern, Middleware und sogar Routing. Dienstanbieter spielen bei der Konfiguration von Anwendungen eine zentrale Rolle.
Wenn Sie die config/app.php
-Datei von Laravel öffnen, sehen Sie das providers
-Array. Der Inhalt des Arrays sind die Klassen aller Dienstanbieter, die von der Anwendung geladen werden sollen. Natürlich gibt es viele „faule“ Anbieter, die nicht bei jeder Anfrage laden, sondern nur dann, wenn ihre Dienste tatsächlich benötigt werden.
In diesem Artikel erfahren Sie, wie Sie Ihren eigenen Dienstanbieter schreiben und ihn in Ihrer Laravel-Anwendung registrieren
Schreibdienstleister
Alle Dienstanbieter erben die Klasse IlluminateSupportServiceProvider
. Die meisten Dienstanbieter enthalten eine register
- und eine boot
-Methode. Bei der register
-Methode binden Sie das Ding einfach an den Service-Container. Anstatt zu versuchen, Listener, Routen oder andere Funktionen in der register
-Methode
zu registrieren, verwenden Sie das Artisan-Befehlszeilentool über make:provider
Der Befehl kann einen neuen Anbieter generieren:
php artisan make:provider RiakServiceProvider
Registrierungsmethode
Wie oben erwähnt, benötigen Sie in der register
-Methode nur Bind den Dienst in den Dienstcontainer. Und versuchen Sie nicht, Listener, Routen oder andere Funktionen in der register
-Methode zu registrieren. Andernfalls besteht die Möglichkeit, dass Sie versehentlich Dienste eines noch nicht geladenen Dienstanbieters nutzen.
Schauen wir uns einen Basisdienstleister an. Bei jeder Dienstanbietermethode greifen Sie immer über das Attribut $app
auf den Dienstcontainer zu:
<?php namespace App\Providers;use Riak\Connection; use Illuminate\Support\ServiceProvider; class RiakServiceProvider extends ServiceProvider{ /** * 在服务容器里注册 * * @return void */ public function register() { $this->app->singleton(Connection::class, function ($app) { return new Connection(config('riak')); }); } }
Dieser Dienstcontainer definiert lediglich eine register
-Methode und verwendet diese Methode, um im Dienstcontainer A <🎜 zu definieren > Schnittstelle wird erstellt. Wenn Sie nicht verstehen, wie ein Service-Container funktioniert, schauen Sie sich dessen Dokumentation an. RiakConnection
bindings
- und singletons
-Attribute
Wenn Ihr Dienstanbieter viele einfache Bindungen registriert, möchten Sie möglicherweise die bindings
- und singletons
-Attribute verwenden, anstatt jede Containerbindung manuell zu registrieren. Wenn der Dienstanbieter vom Framework geladen wird, werden diese Eigenschaften automatisch überprüft und die entsprechenden Bindungen registriert
<?php namespace App\Providers; use App\Contracts\ServerProvider; use App\Contracts\DowntimeNotifier; use Illuminate\Support\ServiceProvider; use App\Services\PingdomDowntimeNotifier; use App\Services\DigitalOceanServerProvider; class AppServiceProvider extends ServiceProvider{ /** * 设定所有的容器绑定的对应关系 * * @var array */ public $bindings = [ ServerProvider::class => DigitalOceanServerProvider::class, ]; /** * 设定所有的单例模式容器绑定的对应关系 * * @var array */ public $singletons = [ DowntimeNotifier::class => PingdomDowntimeNotifier::class, ]; }
Bootstrap-Methode
wenn wir wollen Wie registriere ich einen View Composer bei einem Dienstanbieter? Dies erfordert die Verwendung der boot
-Methode. Diese Methode wird erst aufgerufen, wenn alle Dienstanbieter registriert sind, was bedeutet, dass wir auf alle anderen vom Framework registrierten Dienste zugreifen können:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider{ /** * 启动所有的应用服务。 * * @return void */ public function boot() { view()->composer('view', function () { // }); } }
Abhängigkeitsinjektion der Startup-Methode
Sie können Typhinweise für die boot
-Methoden eines Dienstanbieters festlegen. Der Service-Container fügt automatisch die von Ihnen benötigten Abhängigkeiten ein:
use Illuminate\Contracts\Routing\ResponseFactory; public function boot(ResponseFactory $response){ $response->macro('caps', function ($value) { // }); }
Registrierte Dienstanbieter
Alle Dienstanbieter werden über Konfigurationsdateien registriertconfig/app.php
. Diese Datei enthält ein providers
-Array, in dem die Namen aller Dienstanbieter aufgeführt sind. Diese Dienstanbieter aktivieren Laravel-Kernkomponenten wie E-Mail, Warteschlangen, Caches usw.
Um einen Anbieter zu registrieren, fügen Sie ihn einfach zum Array hinzu:
'providers' => [ // 其他服务提供者 App\Providers\ComposerServiceProvider::class,],
Deferred Provider
Wenn Ihr Dienstanbieter befindet sich nur im Servicecontainer Bei der Registrierung können Sie das Laden der Bindung verzögern, bis der Dienst, für den die Bindung registriert ist, wirklich benötigt wird. Durch verzögertes Laden eines solchen Anbieters wird die Leistung der Anwendung verbessert, da diese nicht bei jeder Anfrage aus dem Dateisystem geladen wird . laden.
Laravel erstellt und speichert eine Liste aller Dienste, die von verzögerten Dienstanbietern bereitgestellt werden, zusammen mit den Namen ihrer Dienstanbieterklassen. Daher lädt Laravel den Dienstanbieter nur, wenn Sie versuchen, einen der Dienste aufzulösen.
Um einen Anbieter verzögert zu laden, müssen Sie die IlluminateContractsSupportDeferrableProvider
-Schnittstelle implementieren und eine provides
-Methode anhängen. Diese provides
-Methode gibt die von diesem Anbieter registrierte Service-Container-Bindung zurück:
<?php namespace App\Providers; use Riak\Connection; use Illuminate\Support\ServiceProvider; use Illuminate\Contracts\Support\DeferrableProvider; class RiakServiceProvider extends ServiceProvider implements DeferrableProvider{ /** * 注册服务提供者。 * * @return void */ public function register() { $this->app->singleton(Connection::class, function ($app) { return new Connection($app['config']['riak']); }); } /** * 获取由提供者提供的服务。 * * @return array */ public function provides() { return [Connection::class]; } }