Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Laravel
Code

So registrieren und verwenden Sie Laravel Service Provider

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Wei Zhang (you can also view the original English article)

Wenn Sie jemals auf das Laravel-Framework gestoßen sind, ist es höchst unwahrscheinlich, dass Sie noch nichts von Service-Containern und Service-Providern gehört haben. In der Tat sind sie das Rückgrat des Laravel-Frameworks und führen alle schweren Lasten aus, wenn Sie eine Instanz einer Laravel-Anwendung starten.

In diesem Artikel erfahren Sie, worum es bei dem Servicebehälter geht. Anschließend werden wir den Serviceprovider im Detail besprechen. Im Verlauf dieses Artikels werde ich außerdem zeigen, wie Sie in Laravel einen benutzerdefinierten Serviceanbieter erstellen. Sobald Sie einen Dienstanbieter erstellt haben, müssen Sie ihn auch bei der Laravel-Anwendung registrieren, um ihn tatsächlich zu verwenden, also werden wir das auch durchgehen.

Es gibt zwei wichtige Methoden, boot und register, die Ihr Dienstanbieter möglicherweise implementiert, und im letzten Abschnitt dieses Artikels werden wir diese beiden Methoden gründlich diskutieren.

Bevor wir in die Diskussion eines Service Providers einsteigen, werde ich versuchen, den Service-Container einzuführen, da er stark in der Implementierung Ihres Service Providers verwendet wird.

Servicebehälter und Service Provider verstehen

Was ist ein Servicebehälter?

Im einfachsten Fall könnte man sagen, dass der Servicebehälter in Laravel eine Box ist, die die Bindungen verschiedener Komponenten enthält und nach Bedarf in der gesamten Anwendung bedient wird.

In den Worten der offiziellen Laravel-Dokumentation:

Der Laravel-Servicebehälter ist ein leistungsstarkes Tool zum Verwalten von Klassenabhängigkeiten und zum Durchführen der Abhängigkeitsinjektion.

Wann immer Sie eine integrierte Komponente oder einen integrierten Dienst injizieren müssen, können Sie sie in Ihrem Konstruktor oder in Ihrer Methode angeben und sie wird automatisch aus dem Servicebehälter eingefügt, da sie alles enthält, was Sie brauchen! Ist das nicht cool? Es erspart Ihnen die manuelle Instanziierung der Komponenten und vermeidet so eine enge Kopplung in Ihrem Code.

Schauen wir uns ein kurzes Beispiel an, um es zu verstehen.

Wie Sie sehen können, benötigt die SomeClass eine Instanz von FooBar, um sich selbst zu instantiieren. Also, im Grunde hat es eine Abhängigkeit, die injiziert werden muss. Laravel erledigt dies automatisch, indem er in den Servicebehälter schaut und die entsprechende Abhängigkeit eingibt.

Und wenn Sie sich fragen, wie Laravel weiß, welche Komponenten oder Dienste in den Service-Container aufgenommen werden sollen, ist die Antwort der Service-Provider. Es ist der Dienstanbieter, der Laravel anweist, verschiedene Komponenten in den Dienstcontainer zu binden. In der Tat heißt es Service-Container-Bindungen, und Sie müssen es über den Service-Provider tun.

Es ist also der Dienstanbieter, der alle Dienstcontainerbindungen registriert, und zwar über die Registermethode der Implementierung des Dienstanbieters.

Das sollte eine andere Frage auf den Tisch bringen: Woher weiß Laravel von verschiedenen Dienstleistern? Hast du gerade etwas gesagt? Ich habe gerade gehört, dass jemand das sagt, Laravel sollte das auch automatisch herausfinden! Oh Mann, das ist zu viel verlangt: Laravel ist ein Framework, kein Superman, oder? Scherz beiseite, das ist etwas, das du Laravel explizit mitteilen musst.

Sehen Sie sich den Inhalt der Datei config/app.php an. Sie finden einen Array-Eintrag, der alle Service Provider auflistet, die beim Bootstrapping der Laravel-Anwendung geladen werden.

Also, das war der Service-Container zu Ihrer Verfügung. Ab dem nächsten Abschnitt konzentrieren wir uns auf den Dienstanbieter, der das Hauptthema dieses Artikels ist!

Was ist ein Dienstleister?

Wenn der Dienstcontainer etwas ist, mit dem Sie Bindungen definieren und Abhängigkeiten injizieren können, ist der Dienstanbieter der Ort, an dem er auftritt.

Werfen wir einen Blick auf einen der Kerndienstanbieter, um zu verstehen, was es tut. Öffnen Sie die Datei vender/laravel/framework/src/Illuminate/Cache/ CacheServiceProvider.php.

Wichtig ist hier die Methode register, mit der Sie Service-Container-Bindungen definieren können. Wie Sie sehen, gibt es drei Bindungen für die Dienste cache, cache.store und memcached.connector.

Im Grunde teilen wir Laravel mit, dass, wenn ein cache-Eintrag aufgelöst werden muss, die Instanz von CacheManager zurückgegeben wird. Wir fügen nur eine Art Mapping in den Service-Container ein, auf den über  $this->app zugegriffen werden kann.

Dies ist die richtige Methode, um einem Laravel-Servicebehälter einen Dienst hinzuzufügen. Damit können Sie auch das größere Bild davon machen, wie Laravel die Registermethode aller Service Provider durchläuft und den Servicebehälter füllt! Und wie bereits erwähnt, wird die Liste der Dienstanbieter aus der Datei config/app.php übernommen.

Und das ist die Geschichte des Dienstleisters. Im nächsten Abschnitt wird erläutert, wie Sie einen benutzerdefinierten Dienstanbieter erstellen, damit Sie Ihre benutzerdefinierten Dienste im Laravel-Dienstcontainer registrieren können.

Erstellen Sie Ihren benutzerdefinierten Serviceanbieter

Laravel ist bereits mit einem praktischen Befehlszeilentool, artisan, ausgestattet, mit dem Sie Vorlagencode erstellen können, sodass Sie ihn nicht von Grund auf neu erstellen müssen. Fahren Sie fort und wechseln Sie zur Befehlszeile, und führen Sie den folgenden Befehl in Ihrem Anwendungsstamm aus, um einen benutzerdefinierten Dienstanbieter zu erstellen.

Und das sollte die Datei EnvatoCustomServiceProvider.php im Verzeichnis app/Providers erstellen. Öffnen Sie die Datei, um zu sehen, was sie enthält.

Wie bereits erwähnt, gibt es zwei Methoden, Boot und Registrierung, mit denen Sie die meiste Zeit arbeiten müssen, wenn Sie mit Ihrem benutzerdefinierten Dienstanbieter arbeiten.

Die register-Methode ist der Ort, an dem Sie alle Ihre benutzerdefinierten Service-Container-Bindungen definieren. Auf der anderen Seite ist die Boot-Methode der Ort, an dem Sie bereits registrierte Dienste über die Register-Methode konsumieren können. Im letzten Abschnitt dieses Artikels werden wir diese zwei Methoden im Detail besprechen, da wir einige praktische Anwendungsfälle durchgehen werden, um die Verwendung beider Methoden zu verstehen.

Registrieren Sie Ihren benutzerdefinierten Serviceanbieter

Sie haben also Ihren benutzerdefinierten Serviceanbieter erstellt. Das ist großartig! Als Nächstes müssen Sie Laravel über Ihren benutzerdefinierten Dienstanbieter informieren, damit dieser ihn während des Bootstrapping zusammen mit anderen Dienstanbietern laden kann.

Um Ihren Dienstanbieter zu registrieren, müssen Sie lediglich einen Eintrag zum Array der Dienstanbieter in der Datei config/app.php hinzufügen.

Und das ist es! Sie haben Ihren Dienstanbieter mit Laravels Plan der Dinge registriert! Aber der Serviceanbieter, den wir erstellt haben, ist fast eine leere Vorlage und im Moment nutzlos. Im nächsten Abschnitt gehen wir ein paar praktische Beispiele durch, um zu sehen, was Sie mit den Register- und Boot-Methoden tun können.

Gehen Sie die Register- und Boot-Methoden durch

Um zu beginnen, gehen wir durch die register-Methode, um zu verstehen, wie Sie es tatsächlich verwenden können. Öffnen Sie die Service Provider-Datei app/Providers/EnvatoCustomServiceProvider.php, die zuvor erstellt wurde, und ersetzen Sie den vorhandenen Code durch Folgendes.

Hier sind zwei wichtige Dinge zu beachten:

  • Wir haben App\Library\Services\DemoOne importiert, damit wir es verwenden können. Die DemoOne-Klasse ist noch nicht erstellt, aber wir werden das gleich tun.
  • In der register-Methode haben wir die bind-Methode des Service-Containers verwendet, um unsere Service-Container-Bindung hinzuzufügen. Wann immer die App\Library\Services\DemoOne-Abhängigkeit aufgelöst werden muss, ruft sie die Closure-Funktion auf und instanziiert das App\Library\Services\DemoOne-Objekt und gibt es zurück.

Sie müssen also nur die app/Library/Services/DemoOne.php erstellen, damit dies funktioniert.

Und hier ist der Code irgendwo in Ihrem Controller, wo die Abhängigkeit injiziert wird.

Das ist ein sehr einfaches Beispiel für das Binden einer Klasse. Im obigen Beispiel ist es nicht erforderlich, einen Service Provider zu erstellen und die Registermethode wie wir zu implementieren, da Laravel diese automatisch mithilfe der Reflektion auflösen kann.

Eine sehr wichtige Anmerkung aus der Laravel-Dokumentation:

Es ist nicht erforderlich, Klassen in den Container zu binden, wenn sie nicht von Schnittstellen abhängig sind. Der Container muss nicht in die Erstellung dieser Objekte eingewiesen werden, da er diese Objekte automatisch mithilfe von Reflektion auflösen kann.

Auf der anderen Seite wäre es sehr nützlich gewesen, wenn Sie eine Schnittstelle an eine bestimmte Implementierung gebunden hätten. Lassen Sie uns ein Beispiel durchgehen, um es zu verstehen.

Lassen Sie uns eine sehr einfache Schnittstelle unter app/Library/Services/Contracts/CustomServiceInterface.php erstellen.

Als Nächstes erstellen wir zwei konkrete Implementierungen dieser Schnittstelle. Im Grunde müssen wir nur zwei Klassen erstellen, die die Schnittstelle CustomServiceInterface erweitern.

Erstellen Sie die DemoOne-Klasse in der App/Library/Services / DemoOne.php.

Ähnlich geht DemoTwo in app/Library/Services/DemoTwo.php.

Anstatt eine Klasse zu binden, binden wir nun eine Schnittstelle. Besuchen Sie EnvatoCustomServiceProvider.php erneut und ändern Sie den Code wie unten gezeigt.

In diesem Fall haben wir die Schnittstelle App\Library\Services\Contracts\CustomServiceInterface an die DemoOne-Implementierung gebunden. Wenn die Abhängigkeit App\Library\Services\Contracts\CustomServiceInterface aufgelöst werden muss, wird das App\Library\Services\DemoOne-Objekt instanziiert und zurückgegeben. Jetzt macht es mehr Sinn, nicht wahr?

Lassen Sie uns schnell den Controller-Code überarbeiten.

Wie Sie vielleicht schon erraten haben, sollte die$customServiceInstance die Instanz von  App\Library \Services\DemoOne! Das Schöne an diesem Ansatz ist, dass Sie die DemoOne-Implementierung problemlos mit der anderen austauschen können.

Nehmen wir an, Sie möchten die DemoTwo-Implementierung anstelle von DemoOne verwenden. In diesem Fall müssen Sie lediglich die folgenden Änderungen im Serviceprovider EnvatoCustomServiceProvider.php vornehmen.

Finde die folgende Zeile:

Und ersetze es mit:

In ähnlicher Weise finden Sie diese:

Das sollte ersetzt werden durch:

Derselbe Ansatz kann verwendet werden, wenn Sie eine Kernimplementierung durch Ihre eigene ersetzen möchten. Und es ist nicht nur die Bind-Methode, die Sie für Ihre Service-Container-Bindungen verwenden könnten. Der Laravel-Servicebehälter bietet verschiedene Möglichkeiten zum Binden in den Servicebehälter. Bitte überprüfen Sie die offizielle Laravel-Dokumentation für die vollständige Referenz.

Der nächste Kandidat ist die boot-Methode, mit der Sie die Laravel-Kernfunktionen erweitern können. Bei dieser Methode können Sie auf alle Services zugreifen, die mit der register-Methode des Service Providers registriert wurden. In den meisten Fällen möchten Sie Ihre Ereignis-Listener in dieser Methode registrieren, die ausgelöst wird, wenn etwas passiert.

Sehen wir uns ein paar Beispiele an, die die Boot-Methode-Implementierung erfordern.

Sie möchten Laravel einen eigenen benutzerdefinierten Formularfeldvalidator hinzufügen.

Wenn Sie einen View-Composer registrieren möchten, ist dies der perfekte Ort dafür! In der Tat könnten wir sagen, dass die Boot-Methode häufig zum Hinzufügen von View-Composern verwendet wird!

Natürlich möchten Sie eine Fassade Illuminate\Support\Facades\View in Ihrem Dienstanbieter in erster Linie importieren.

In demselben Gebiet können Sie die Daten auch über mehrere Ansichten hinweg teilen.

Es kann auch verwendet werden, um explizite Modellbindungen zu definieren.

Dies waren einige Beispiele, um die Verwendung der Boot-Methode zu demonstrieren. Je mehr Sie in Laravel ankommen, desto mehr Gründe finden Sie, um es zu implementieren!

Damit sind wir am Ende dieses Artikels angelangt. Ich hoffe, Sie haben die Themen genossen, die in diesem Artikel diskutiert wurden.

Fazit

Es war die Diskussion über Service Provider, die die Hauptattraktion dieses Artikels war, obwohl wir unseren Artikel mit dem Service Container begannen, da dies eine wichtige Zutat war, um den Service Provider zu verstehen.

Daraufhin entwickelten wir einen kundenspezifischen Dienstleister, und in der zweiten Hälfte des Artikels gingen wir ein paar praktische Beispiele durch.

Für diejenigen von Ihnen, die gerade mit Laravel anfangen oder Ihr Wissen, Ihre Website oder Anwendung mit Erweiterungen erweitern möchten, haben wir eine Vielzahl von Dingen, die Sie bei Envato Market studieren können.

Wenn Sie Fragen oder Kommentare haben, schießen Sie einfach mit dem Feed unten!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.