Eigenes Package mit Laravel 5 erstellen

Laravel 5 basiert auf Packages. Die meisten Funktionalitäten – unter anderem auch das Framework selbst – sind in diese Packages aufgeteilt. Mit Hilfe von Composer können wir dank dieser Aufteilung unser Projekt schnell und ohne großen Aufwand erweitern. Doch nicht immer gibt es genau die Funktionalität, die wir benötigen, als fertiges Package. Sehen wir uns also die Grundlagen an um unser eigenes Package zu entwickeln und einzubinden.

Ordner und Dateien anlegen

Für diesen Artikel gehen wir davon aus, dass bereits eine lauffähige Installation von Laravel 5 zur Verfügung steht. Als ersten Schritt legen wir die benötigten Ordner und Dateien an.

Was früher durch den Konsolenbefehl workbench automatisch erledigt wurde ist nun unsere Aufgabe. Dadurch können wir die Struktur unserer Packages besser selbst bestimmen. Installieren wir diese über Composer werden sie automatisch im Ordner vendor angelegt. Für die Entwicklung unseres lokalen Packages legen wir allerdings zuerst im Hauptverzeichnis unserer Laravel Installation den Ordner packages an.

Den Ersteller eines Packages nennt man – wie ihr euch vielleicht schon dachtet – einen Vendor. Um Namenskollisionen zu vermeiden und die Module zuordnen zu können lautet die Struktur innerhalb des vendor oder packages Verzeichnis ganz einfach vendorname/packagename. Als Vendorname bietet sich zum Beispiel der Nachname des Autors oder ein Firmenname an. Der Packagename beschreibt, worum es sich dabei handelt.

Innerhalb unseres Verzeichnisses legen wir nun noch einen src Ordner mit unserer Testklasse Test.php an.

 

Der Service Provider

Service Provider sind in Laravel 5 für die Registrierung von quasi allem zuständig. Entwickeln wir einen eigenen Provider können wir dem Framework mitteilen, diesen beim Start zu initialisieren und auszuführen. Innerhalb des Providers haben wir dann die Möglichkeit, unserer Applikation den Zugriff auf beliebig viele Services zu ermöglichen. Fügen wir also die Datei app/Providers/TestProvider.php hinzu.

Wie im Beispiel zu sehen gibt es zwei wichtige Dinge in unserem Provider. Gehen wir sie in diesem besonderen Fall von hinten durch.

  • Die register Methode wird beim Start unserer Applikation für jeden Service Provider ausgeführt. Hier können wir Services registrieren um sie später an anderen Stellen zu verwenden. Problematisch wird es, wenn ein Service von einem anderen abhängt, da wir die Reihenfolge nicht immer garantieren können, in der die Services registriert werden.
  • Dieses Problem löst die boot Methode. Diese wird aufgerufen, nachdem alle Services registriert wurden. Hier können wir also bereits auf alle Servicefunktionalitäten zugreifen.

Innerhalb der register Methode binden wir in diesem Beispiel nur einen Service, nämlich unseren Testservice. Die bind() Methode nimmt dabei zwei Parameter – den Namen des Services sowie eine Callback-Funktion, die ein Objekt unserer Klasse zurückgibt.

Damit Laravel von der Existenz unseres Service Providers erfährt fügen wir ihn in der Datei config/app.php dem Array providers hinzu:

App\Providers\TestProvider::class,

 

 

Den Namespace bekannt machen

Im Service Provider erzeugen wir ein Objekt unserer Serviceklasse. Damit das funktioniert müssen wir dem Framework noch klar machen, wo es die Klasse findet, da die Namespaces in diesem Fall nicht den autoloading Regeln folgen. Um das zu erreichen fügen wir in der Datei composer.json im Bereich autoload unter psr-4 einfach folgende Zeile hinzu:

„FTiersch\\Test\\“: „packages/ftiersch/location/src“

Dadurch sucht Laravel bei einem Aufruf der Klassen im Namespace FTiersch\Test automatisch auch im angegebenen Ordner (in dem sich unsere oben angelegte Testklasse auch befindet).

 

Unser Service kommt zum Einsatz

Nun, da alles vorbereitet ist und unser Service ordnungsgemäß registriert und konfiguriert ist, können wir ihn benutzen. Dafür haben wir mehrere Möglichkeiten:

  1. Wir können unseren Service mit dem Aufruf $test = App::make(‚Test‘); auflösen. Die make Methode gibt das Objekt aus unserem bind-Callback oben zurück, danach können wir problemlos darauf zugreifen.
  2. Laravel 5 löst automatisch Abhängigkeiten auf, die im Konstruktor von beispielsweise Controllern oder Models übergeben werden. Mit Hilfe des Type Hintings wird also automatisch ein Objekt des Services in die Klasse übergeben, wenn wir folgenden Konstruktor definieren:

     

 

Mit diesen Hilfsmitteln können wir nun ganz simpel Services erstellen, die übergreifende oder unabhängige Funktionalitäten enthalten, welche in unserer Businesslogik nichts verloren haben. Wird das ganze außerdem noch ordentlich strukturiert können wir diese Packages auch sehr simpel in anderen Laravel 5 Projekten wiederverwenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*