Wenn Sie jemals das Laravel-Framework kennengelernt haben, ist es höchst unwahrscheinlich, dass Sie noch nicht von Service-Containern und Service-Providern gehört haben. Tatsächlich sind sie das Rückgrat des Laravel-Frameworks und erledigen alle Anstrengungen, wenn Sie eine Instanz einer Laravel-Anwendung starten.
In diesem Artikel erhalten Sie einen Einblick in den Inhalt des Service-Containers. Anschließend werden wir den Dienstanbieter ausführlich besprechen. Im Verlauf dieses Artikels werde ich auch zeigen, wie Sie einen benutzerdefinierten Dienstanbieter in Laravel erstellen. Nachdem Sie einen Dienstanbieter erstellt haben, müssen Sie ihn auch bei der Laravel-Anwendung registrieren, um ihn tatsächlich nutzen zu können.
Es gibt zwei wichtige Methoden, Booten und Registrieren, die Ihr Diensteanbieter implementieren kann. Im letzten Abschnitt dieses Artikels werden diese beiden Methoden ausführlich beschrieben.
Bevor wir in die Diskussion eines Diensteanbieters eintauchen, versuche ich, den Dienstcontainer einzuführen, da er in der Implementierung Ihres Diensteanbieters stark verwendet wird.
In den einfachsten Ausdrücken könnte man sagen, dass der Service-Container in Laravel eine Box ist, in der verschiedene Komponentenbindungen enthalten sind. Diese werden nach Bedarf in der gesamten Anwendung bedient.
In den Worten der offiziellen Laravel-Dokumentation:
Der Laravel-Service-Container ist ein leistungsfähiges Werkzeug zum Verwalten von Klassenabhängigkeiten und zum Durchführen von Abhängigkeitseingaben.
Wenn Sie also eine eingebaute Komponente oder einen Service injizieren müssen, geben Sie in Ihrem Konstruktor oder Ihrer Methode einen Hinweis ein. Dieser wird automatisch aus dem Service-Container eingefügt, da er alles enthält, was Sie brauchen! Ist das nicht cool? Es erspart Ihnen das manuelle Instanziieren der Komponenten und verhindert somit eine enge Kopplung in Ihrem Code.
Schauen wir uns ein schnelles Beispiel an, um es zu verstehen.
Klasse SomeClass öffentliche Funktion __construct (FooBar $ foobarObject) // use $ foobarObject-Objekt
Wie Sie sehen können, die SomeClass
braucht eine Instanz von FooBar
sich selbst instanziieren Im Grunde hat es eine Abhängigkeit, die injiziert werden muss. Laravel tut dies automatisch, indem es in den Service-Container blickt und die entsprechende Abhängigkeit einfügt.
Und wenn Sie sich fragen, wie Laravel weiß, welche Komponenten oder Services in den Service-Container aufgenommen werden sollen, ist der Service-Provider die Antwort. Es ist der Dienstanbieter, der Laravel anweist, verschiedene Komponenten in den Dienstcontainer einzubinden. Es handelt sich dabei um Service-Container-Bindungen, und Sie müssen dies über den Dienstanbieter tun.
Es ist also der Dienstanbieter, der alle Dienstcontainerbindungen registriert, und dies erfolgt über die Methode register der Dienstanbieterimplementierung.
Das sollte eine andere Frage auf den Tisch bringen: Woher weiß Laravel verschiedene Dienstleister? Hast du gerade etwas gesagt? Ich habe gerade gehört, dass jemand gesagt hat, dass Laravel dies automatisch herausfinden sollte! Oh Junge, das ist zu viel zu fragen: Laravel ist ein Rahmen, kein Supermann, oder? Scherz auseinander, das ist etwas, was Sie benötigen, um Laravel explizit zu informieren.
Schauen Sie sich den Inhalt der config / app.php
Datei. Sie finden einen Array-Eintrag, in dem alle Dienstanbieter aufgelistet sind, die während des Bootstrappens der Laravel-Anwendung geladen werden.
'provider' => [/ * * Laravel Framework Service Provider… * / Illuminate \ Auth \ AuthServiceProvider :: Klasse, Beleuchtung \ Broadcasting \ BroadcastServiceProvider :: Klasse, Illuminate \ Bus \ BusServiceProvider :: Klasse, Illuminate \ Cache \ CacheServiceProvider :: Klasse, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: Klasse, Illuminate \ Cookie \ CookieServiceProvider :: Klasse, Illuminate \ Database \ DatabaseServiceProvider :: Klasse, Illuminate \ EncryptionServiceProvider :: Klasse, Illuminate \ Filesystem \ Filesystem \ FilesystemServiceProvider :: Klasse, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: Klasse, Illuminate \ Hashing \ HashServiceProvider :: Klasse, Illuminate \ Mail \ MailServiceProvider :: Klasse, Illuminate \ Benachrichtigungen \ NotificationServiceProvider :: Klasse, Illuminate \ Pagination \ PaginationServiceProvider :: Klasse, Illuminate \ Pipeline \ PipelineServiceProvider :: Klasse, Illuminate \ Queue \ QueueServiceProvider :: Klasse, Illuminate \ Redis \ RedisServiceProvider :: Klasse, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Übersetzung \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Paketdienstanbieter… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Anwendungsdienstanbieter… * / App \ Providers \ AppServiceProvider :: Klasse, App \ Providers \ AuthServiceProvider :: Klasse, // App \ Providers \ BroadcastServiceProvider :: Klasse, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class,],
Das war also der Servicebehälter zu Ihrer Verfügung. Ab dem nächsten Abschnitt konzentrieren wir uns auf den Dienstanbieter, der das Hauptthema dieses Artikels ist!
Wenn Sie mit dem Service-Container Bindungen definieren und Abhängigkeiten einfügen können, ist der Service-Provider der Ort, an dem dies geschieht.
Werfen wir einen Blick auf einen der wichtigsten Dienstanbieter, um zu verstehen, was er tut. Mach weiter und öffne die vender / laravel / framework / src / Leuchten / Cache / CacheServiceProvider.php
Datei.
public function register () $ this-> app-> singleton ('cache', function ($ app) return new CacheManager ($ app);); $ this-> app-> singleton ('cache.store', function ($ app) return $ app ['cache'] -> driver ();); $ this-> app-> singleton ('memcached.connector', function () return new MemcachedConnector;);
Das Wichtigste dabei ist das registrieren
Methode, mit der Sie Dienstcontainerbindungen definieren können. Wie Sie sehen, gibt es drei Bindungen für die Zwischenspeicher
, cache.store
und memcached.connector
Dienstleistungen.
Grundsätzlich informieren wir Laravel, dass immer dann, wenn eine Lösung erforderlich ist Zwischenspeicher
Eintrag, sollte es die Instanz von zurückgeben CacheManager
. Wir fügen also einfach eine Art Zuordnung in den Service-Container ein, auf die über zugegriffen werden kann $ this-> app
.
Dies ist der richtige Weg, um einen Service zu einem Laravel-Service-Container hinzuzufügen. Auf diese Weise können Sie auch den Überblick darüber gewinnen, wie Laravel die Registrierungsmethode aller Dienstanbieter durchläuft und den Dienstcontainer auffüllt. Und wie bereits erwähnt, wird die Liste der Diensteanbieter aus dem Internet aufgenommen config / app.php
Datei.
Und das ist die Geschichte des Dienstleisters. Im nächsten Abschnitt wird beschrieben, wie Sie einen benutzerdefinierten Service Provider erstellen, mit dem Sie Ihre benutzerdefinierten Services im Laravel-Service-Container registrieren können.
Laravel wird bereits mit einem praktischen Befehlszeilen-Dienstprogramm geliefert, Handwerker
, So können Sie Vorlagencode erstellen, damit Sie ihn nicht von Grund auf neu erstellen müssen. Fahren Sie mit der Befehlszeile fort und führen Sie den folgenden Befehl in Ihrem Anwendungsstamm aus, um einen benutzerdefinierten Dienstanbieter zu erstellen.
$ php Handwerker make: Anbieter EnvatoCustomServiceProvider Anbieter erfolgreich erstellt.
Und das sollte die Datei erstellen EnvatoCustomServiceProvider.php
unter dem App / Anbieter
Verzeichnis. Öffnen Sie die Datei, um zu sehen, was darin enthalten ist.
Wie bereits erwähnt, gibt es zwei Methoden, boot und register, mit denen Sie sich meistens beschäftigen, wenn Sie mit Ihrem benutzerdefinierten Dienstanbieter arbeiten.
Das
registrieren
Methode ist der Ort, an dem Sie alle benutzerdefinierten Service-Container-Bindungen definieren. Auf der anderen Seite dieStiefel
Methode ist der Ort, an dem Sie bereits registrierte Dienste über die Registermethode in Anspruch nehmen können. Im letzten Abschnitt dieses Artikels werden wir diese beiden Methoden ausführlich diskutieren, während wir einige praktische Anwendungsfälle durchgehen, um die Verwendung beider Methoden zu verstehen.Registrieren Sie Ihren Custom Service Provider
Sie haben also Ihren benutzerdefinierten Dienstanbieter erstellt. Das ist großartig! Als Nächstes müssen Sie Laravel über Ihren benutzerdefinierten Dienstanbieter informieren, damit dieser ihn beim Bootstrapping zusammen mit anderen Dienstanbietern laden kann.
Um Ihren Diensteanbieter zu registrieren, müssen Sie lediglich einen Eintrag zu der Liste der Diensteanbieter in hinzufügen
config / app.php
Datei.'provider' => [/ * * Laravel Framework Service Provider… * / Illuminate \ Auth \ AuthServiceProvider :: Klasse, Beleuchtung \ Broadcasting \ BroadcastServiceProvider :: Klasse, Illuminate \ Bus \ BusServiceProvider :: Klasse, Illuminate \ Cache \ CacheServiceProvider :: Klasse, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: Klasse, Illuminate \ Cookie \ CookieServiceProvider :: Klasse, Illuminate \ Database \ DatabaseServiceProvider :: Klasse, Illuminate \ EncryptionServiceProvider :: Klasse, Illuminate \ Filesystem \ Filesystem \ FilesystemServiceProvider :: Klasse, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: Klasse, Illuminate \ Hashing \ HashServiceProvider :: Klasse, Illuminate \ Mail \ MailServiceProvider :: Klasse, Illuminate \ Benachrichtigungen \ NotificationServiceProvider :: Klasse, Illuminate \ Pagination \ PaginationServiceProvider :: Klasse, Illuminate \ Pipeline \ PipelineServiceProvider :: Klasse, Illuminate \ Queue \ QueueServiceProvider :: Klasse, Illuminate \ Redis \ RedisServiceProvider :: Klasse, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Übersetzung \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Paketdienstanbieter… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Anwendungsdienstanbieter… * / App \ Providers \ AppServiceProvider :: Klasse, App \ Providers \ AuthServiceProvider :: Klasse, // App \ Providers \ BroadcastServiceProvider :: Klasse, App \ Providers \ EventServiceProvider :: Klasse, App \ Providers \ RouteServiceProvider :: Klasse, App \ Providers \ EnvatoCustomServiceProvider :: Klasse,],Und das ist es! Sie haben Ihren Diensteanbieter bei Laravel registriert. Der von uns erstellte Diensteanbieter ist jedoch fast eine leere Vorlage und im Moment ohne Nutzen. Im nächsten Abschnitt gehen wir einige praktische Beispiele durch, um zu sehen, was Sie mit den Methoden register und boot tun können.
Gehen Sie die Register- und Boot-Methoden durch
Zunächst gehen wir durch
registrieren
Methode, um zu verstehen, wie Sie es tatsächlich verwenden könnten. Öffnen Sie die Service Provider-Dateiapp / Providers / EnvatoCustomServiceProvider.php
das zuvor erstellt wurde und den vorhandenen Code durch den folgenden ersetzen.app-> bind ('App \ Library \ Services \ DemoOne', Funktion ($ app) return new DemoOne (););Hier sind zwei wichtige Punkte zu beachten:
App \ Library \ Services \ DemoOne
damit wir es benutzen können. Das DemoOne
Klasse ist noch nicht erstellt, aber wir werden das gleich tun.binden
Methode des Service-Containers zum Hinzufügen unserer Service-Container-Bindung. Also wann immer die App \ Library \ Services \ DemoOne
Abhängigkeit muss aufgelöst werden, es wird die Schließungsfunktion aufgerufen, und die Instanz wird instanziiert und zurückgegeben App \ Library \ Services \ DemoOne
Objekt.Sie müssen also nur das erstellen app / Bibliothek / Dienste / DemoOne.php
Datei, damit dies funktioniert.
Und hier ist der Code irgendwo in Ihrem Controller, wo die Abhängigkeit eingefügt wird.
doSomethingUseful ();Das ist ein sehr einfaches Beispiel für das Binden einer Klasse. Im obigen Beispiel ist es nicht erforderlich, einen Dienstanbieter zu erstellen und die Registermethode wie bei uns zu implementieren, da Laravel sie automatisch mithilfe von Reflection auflösen kann.
Ein sehr wichtiger Hinweis 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 darüber informiert werden, wie diese Objekte erstellt werden, da er diese Objekte automatisch mithilfe von Reflection auflösen kann.Andererseits wäre es wirklich nützlich gewesen, wenn Sie eine Schnittstelle an eine bestimmte Implementierung gebunden hätten. Gehen wir ein Beispiel durch, um es zu verstehen.
Erstellen wir eine sehr einfache Schnittstelle unter
app / Library / Services / Verträge / CustomServiceInterface.php
.Als Nächstes erstellen wir zwei konkrete Implementierungen dieser Schnittstelle. Grundsätzlich müssen wir nur zwei Klassen erstellen, die die Erweiterung erweitern
CustomServiceInterface
Schnittstelle.Erstellen Sie die
DemoOne
Klasse inapp / Bibliothek / Dienste / DemoOne.php
.Ähnlich,
DemoTwo
geht reinapp / Bibliothek / Dienste / DemoTwo.php
.Anstatt eine Klasse zu binden, binden wir jetzt eine Schnittstelle. Erneut besuchen
EnvatoCustomServiceProvider.php
und ändern Sie den Code wie unten gezeigt.app-> bind ('App \ Library \ Services \ Contracts \ CustomServiceInterface', Funktion ($ app) return new DemoOne (););In diesem Fall haben wir die gebunden
App \ Library \ Services \ Contracts \ CustomServiceInterface
Schnittstelle zumDemoOne
Implementierung. Also, wann immer derApp \ Library \ Services \ Contracts \ CustomServiceInterface
Abhängigkeit muss aufgelöst werden, instanziiert werden und gibt das zurückApp \ Library \ Services \ DemoOne
Objekt. Jetzt macht es mehr Sinn, oder??Lassen Sie uns auch den Controller-Code schnell überarbeiten.
doSomethingUseful ();Wie Sie vielleicht schon erraten haben, das
$ customServiceInstance
sollte die Instanz von seinApp \ Library \ Services \ DemoOne
! Das Schöne an diesem Ansatz ist, dass Sie das tauschen könnenDemoOne
Implementierung mit der anderen leicht.Nehmen wir an, Sie möchten das verwenden
DemoTwo
Implementierung stattDemoOne
. In diesem Fall müssen Sie lediglich die folgenden Änderungen am Dienstanbieter vornehmenEnvatoCustomServiceProvider.php
.Suchen Sie die folgende Zeile:
Verwenden Sie App \ Library \ Services \ DemoOne.Und ersetze es mit:
Verwenden Sie App \ Library \ Services \ DemoTwo;Finden Sie auch dieses hier:
neue DemoOne () zurückgeben;Das sollte ersetzt werden durch:
return neues DemoTwo ();Der gleiche Ansatz kann verwendet werden, wenn Sie eine Kernimplementierung durch Ihre eigene ersetzen möchten. Und es ist nicht nur die Bindungsmethode, die Sie für Ihre Service-Container-Bindungen verwenden können. Der Laravel-Servicebehälter bietet verschiedene Möglichkeiten zum Einbinden in den Servicebehälter. Bitte überprüfen Sie die offizielle Laravel-Dokumentation für die vollständige Referenz.
Der nächste Kandidat ist der
Stiefel
Methode, mit der Sie die Kernfunktionen von Laravel erweitern können. Bei dieser Methode können Sie auf alle Dienste zugreifen, die mit der Registrierungsmethode des Diensteanbieters registriert wurden. In den meisten Fällen möchten Sie Ihre Ereignis-Listener in dieser Methode registrieren, die ausgelöst wird, wenn etwas passiert.Schauen wir uns ein paar Beispiele an, die die Implementierung der Boot-Methode erfordern.
Sie möchten Ihren eigenen benutzerdefinierten Formularfeld-Validator zu Laravel hinzufügen.
public function boot () Validator :: extend ('my_custom_validator', Funktion ($ -Attribut, $ -Wert, $ -Parameter, $ -Validator) // Validierungslogik geht hier hin…);Wenn Sie einen View-Komponisten registrieren möchten, ist dies der perfekte Ort dafür! In der Tat könnte man sagen, dass die Boot-Methode häufig verwendet wird, um View-Komponisten hinzuzufügen!
public function boot () View :: composer ('demo', 'App \ Http \ ViewComposers \ DemoComposer');Natürlich möchten Sie eine Fassade importieren
Illuminate \ Support \ Facades \ View
in erster Linie in Ihrem Dienstanbieter.In demselben Gebiet können Sie die Daten auch für mehrere Ansichten freigeben!
public function boot () View :: share ('key', 'value');Es kann auch verwendet werden, um explizite Modellbindungen zu definieren.
öffentliche Funktion boot () parent :: boot (); Route :: model ('user', App \ User :: class);Dies sind einige Beispiele, um die Verwendung der Boot-Methode zu veranschaulichen. Je mehr Sie in Laravel sind, desto mehr Gründe finden Sie, um es zu implementieren!
Damit sind wir am Ende dieses Artikels angelangt. Ich hoffe, dass Ihnen die in diesem Artikel behandelten Themen gefallen haben.
Fazit
Die Diskussion über Dienstanbieter war der Hauptanziehungspunkt dieses Artikels, obwohl wir unseren Artikel mit dem Dienstcontainer begannen, da dies ein wichtiger Bestandteil war, um den Dienstanbieter zu verstehen.
Anschließend haben wir einen Anbieter für kundenspezifische Dienste entwickelt, und in der zweiten Hälfte des Artikels haben wir einige praktische Beispiele gezeigt.
Für diejenigen unter Ihnen, die entweder gerade erst mit Laravel beginnen oder Ihr Wissen, Ihre Site oder Anwendung mit Erweiterungen erweitern möchten, haben wir eine Vielzahl von Möglichkeiten, die Sie bei Envato Market lernen können.
Wenn Sie Fragen oder Kommentare haben, nehmen Sie einfach den Feed mit dem folgenden Feed auf!