Skip to main content

Was ist ein Paket?

Ein Paket in Laravel ist ein Composer-Paket, das der Anwendung Funktionalität hinzufügt. Grob unterscheidet man zwei Arten:
  • Eigenständige Pakete — Allgemeine PHP-Bibliotheken, die nicht von Laravel abhängen (z. B. Carbon, Pest).
  • Laravel-Pakete — Pakete mit Funktionen, die eng mit Laravel integriert sind, etwa Routen, Controller, Views oder Konfiguration.
Diese Anleitung behandelt die zweite Kategorie: die Entwicklung Laravel-spezifischer Pakete. Für die Paketentwicklung müssen Sie die internen Strukturen von Laravel — Service Provider, Facades, das Veröffentlichen von Konfigurationsdateien und mehr — gut kennen.
Wenn Sie Tests für Ihr Paket schreiben, verwenden Sie Orchestra Testbench. Damit können Sie Tests für Ihr Paket schreiben, als befänden Sie sich in einer gewöhnlichen Laravel-Anwendung.

Automatische Paket-Erkennung

Sobald ein Paket installiert wird, liest Laravel den Abschnitt extra.laravel aus der composer.json und registriert Service Provider und Facades automatisch.
Mit dieser Konfiguration wird das Paket automatisch geladen, ohne dass die Nutzer bootstrap/providers.php manuell bearbeiten müssen.
Wie diese automatische Erkennung intern implementiert ist und wann der Cache neu erstellt wird, erläutern wir ausführlich unter Interne Struktur der automatischen Paket-Erkennung.

Automatische Erkennung deaktivieren

Wenn Nutzer die automatische Erkennung für ein bestimmtes Paket deaktivieren möchten, konfigurieren sie dies in der composer.json der Anwendung.

Aufgaben des Service Providers

Der Service Provider ist der Einstiegspunkt eines Pakets. Hier bündeln Sie die Registrierung von Ressourcen wie Views, Konfiguration, Migrationen und Routen bei Laravel. Ein Service Provider erbt von Illuminate\Support\ServiceProvider und besitzt die zwei Methoden register und boot.
Registrieren Sie in der register-Methode keine Event-Listener, Routen oder Views. Sie könnten sonst versehentlich Services eines noch nicht geladenen Service Providers verwenden. Alles außer Bindings gehört in die boot-Methode.
Wie Sie einen Service erweitern, ohne ihn vor seiner Verwendung zu erzeugen, und Einstellungen auch auf bereits aufgelöste Services anwenden, erfahren Sie unter Hooks nach der Service-Auflösung in Paketen. Dort werden der Ausführungszeitpunkt von callAfterResolving() und ein Design erläutert, das mehrfache Anwendung verträgt. Wie Sie Services so registrieren, dass auch in Octane und Queue-Workern kein Zustand mitgeschleppt wird, erfahren Sie unter Lebenszyklus-Design für Paket-Services. Dort werden die interne Implementierung von scoped() und die Fallstricke bei von Singletons gehaltenen Abhängigkeiten erläutert.

Veröffentlichen von Konfigurationsdateien

publishes() — Dateien veröffentlichen

Wenn Sie publishes() in der boot-Methode aufrufen, können Nutzer die Konfigurationsdatei mit dem Befehl vendor:publish in ihre eigene Anwendung kopieren.
Nach der Veröffentlichung greifen Sie auf die Konfigurationswerte wie üblich zu.

mergeConfigFrom() — Standardwerte zusammenführen

Wenn Sie mergeConfigFrom() in der register-Methode verwenden, werden die Standardwerte des Pakets auch dann genutzt, wenn Nutzer die Konfigurationsdatei nicht veröffentlicht haben.
mergeConfigFrom() führt verschachtelte Arrays nicht rekursiv zusammen. Bei Konfigurationen mit mehrdimensionalen Arrays kann es vorkommen, dass restliche Optionen nicht ergänzt werden, wenn Nutzer nur einen Teil definieren.
Den Unterschied zur rekursiven Ersetzungsmethode von Laravel 13, den Umgang mit Listen mit numerischen Schlüsseln und die Update-Schritte bei Verwendung des Konfigurations-Caches erläutert Paketkonfiguration zusammenführen und cachen.

Veröffentlichungsgruppen mit Tags trennen

Wenn Sie im zweiten Argument von publishes() einen Tag angeben, können Nutzer gezielt nur die benötigten Ressourcen veröffentlichen.

Registrieren von Routen

Sie laden Route-Dateien mit loadRoutesFrom(). Wenn der Route-Cache der Anwendung aktiv ist, wird der Aufruf automatisch übersprungen.
In der Route-Datei geben Sie die Controller des Pakets an.
Die explizite Angabe von Middleware, das Vermeiden von Kollisionen bei URIs und Routennamen sowie die Schritte, mit denen Konfigurationsänderungen im Cache ankommen, erläutert Paket-Routen registrieren und cachen.

Veröffentlichen von Migrationen

Mit publishesMigrations() registrieren Sie Migrationsdateien zur Veröffentlichung. In der Standardkonfiguration von Laravel 13 ist database.migrations.update_date_on_publish aktiviert, daher wird der Zeitstempel im Dateinamen beim Veröffentlichen aktualisiert. Ist die Einstellung deaktiviert oder nicht vorhanden, findet diese Aktualisierung nicht statt.
Wann Sie veröffentlichen oder direkt laden sollten, unter welchen Bedingungen sich Zeitstempel ändern, welche Risiken erneutes Veröffentlichen birgt und wie Sie Schemaänderungen an bestehende Nutzer ausliefern, erfahren Sie unter Paket-Migrationen veröffentlichen und aktualisieren.

Veröffentlichen von Views

loadViewsFrom() — Views registrieren

Mit loadViewsFrom() registrieren Sie ein View-Verzeichnis. Über den Namespace im zweiten Argument referenzieren Sie die Views im Format package::view.
Nach der Registrierung sprechen Sie Views über den Paket-Namespace an.
Laravel sucht die Views an zwei Orten: Zuerst wird das Verzeichnis resources/views/vendor/courier der Anwendung geprüft, andernfalls das View-Verzeichnis des Pakets. So können Nutzer die Views anpassen. Die Suchreihenfolge in der Implementierung, den Fallback pro Datei, die Auslieferung von Änderungen an veröffentlichte Templates und den Unterschied zum Blade-Cache erläutert Paket-Views überschreiben und aktualisieren.

Views veröffentlichen

Blade-Komponenten registrieren

Wenn Sie Komponenten in Ihr Paket aufnehmen möchten, registrieren Sie sie in der boot-Methode.
Sie können Komponenten auch en bloc über einen Komponenten-Namespace registrieren.

Öffentliche Assets ausliefern

Um JavaScript, CSS und Bilder Ihres Pakets auszuliefern, registrieren Sie mit publishes() eine Kopie etwa nach public_path('vendor/courier'). Wenn Sie das Paket aktualisieren, ändern sich bereits veröffentlichte Dateien nicht automatisch. Die Auswahl über Tags und Provider, den Unterschied zwischen --force und --existing, den Umgang mit gelöschten Dateien und Updates über laravel-assets erläutert Öffentliche Paket-Assets veröffentlichen und aktualisieren.

Veröffentlichen von Übersetzungsdateien

Mit loadTranslationsFrom() registrieren Sie Übersetzungsdateien. Übersetzungen werden im Format package::file.key angesprochen.
Wenn Sie JSON-Übersetzungsdateien nutzen, verwenden Sie loadJsonTranslationsFrom().
Das teilweise Überschreiben von PHP-Übersetzungen, Ladereihenfolge und Überschreibungsziel von JSON-Übersetzungen sowie die Kompatibilität von Übersetzungsschlüsseln und das Aktualisieren veröffentlichter Dateien werden unter Paketübersetzungen überschreiben und aktualisieren erläutert.

Registrieren von Kommandos

Artisan-Kommandos eines Pakets registrieren Sie mit der Methode commands(). Üblich ist, sie nur in der Konsolenumgebung zu registrieren.

Integration in den optimize-Befehl

Wenn Ihr Paket eigene Caches besitzt, können Sie diese mit der Methode optimizes() in php artisan optimize und php artisan optimize:clear einbinden.
Das Registrieren von Befehlsklassen und das Registrieren von Optimierungs-Tasks sind getrennte Vorgänge. Kollisionen von Registrierungsschlüsseln, Ausschlüsse mit --except, die Ausführungsreihenfolge gegenüber den Standard-Tasks und Exit-Codes bei Fehlern werden unter Paket-Caches in optimize integrieren erläutert.

Informationen zum about-Befehl hinzufügen

Um Paketinformationen zur Ausgabe von php artisan about hinzuzufügen, verwenden Sie AboutCommand::add().
Wann die Daten ausgewertet werden, wie --only und die JSON-Ausgabe funktionieren, wie Sie keine Geheimnisse ausgeben und wie Sie den Registrierungszustand in Tests behandeln, erfahren Sie unter Paket-Diagnoseinformationen zu about hinzufügen.

Facades erstellen

Mit einer Facade können Sie Bindings des Service Containers so aufrufen, als handele es sich um statische Methoden.
1

Service-Klasse erstellen

2

Facade-Klasse erstellen

Erben Sie von Illuminate\Support\Facades\Facade und geben Sie in getFacadeAccessor() den Binding-Schlüssel des Service Containers zurück.
3

Binding im Service Provider

4

Registrierung in composer.json

Mit @method-Annotationen im PHPDoc der Facade-Methoden aktivieren Sie die Autovervollständigung Ihrer IDE.

DeferrableProvider — Lazy Loading umsetzen

Provider, die ausschließlich Bindings am Service Container vornehmen, können Lazy Loading realisieren, indem sie das Interface DeferrableProvider implementieren. Der Provider wird dann erst geladen, wenn der Service tatsächlich benötigt wird, was die Anwendungsleistung verbessert.
Laravel kompiliert die Liste der von deferred Providern bereitgestellten Services und speichert sie ab. Der Provider wird erst geladen, wenn ein in provides() aufgeführter Service aufgelöst wird.
Verwenden Sie DeferrableProvider nicht für Provider, die Ressourcen registrieren (Views, Routen, Event-Listener usw.). Beim Lazy Loading würden diese Ressourcen nicht registriert werden.

Testen von Paketen

Um ein Paket isoliert zu testen, verwenden Sie Orchestra Testbench. Damit lassen sich Tests wie in einer regulären Laravel-Anwendung schreiben.
Überschreiben Sie in Ihren Testfällen getPackageProviders(), um den Service Provider des Pakets zu registrieren.

Veröffentlichung auf Composer

Best Practices für die Veröffentlichung Ihres Pakets auf Packagist: Grundkonfiguration der composer.json
Durch die Abhängigkeit von illuminate/support binden Sie nur die tatsächlich benötigten Laravel-Komponenten ein und nicht das gesamte illuminate/framework. Halten Sie den Abhängigkeitsbaum Ihres Pakets klein.
Beispielhafte Verzeichnisstruktur

Verwandte Seiten

Service Provider

Details zu den Methoden register und boot sowie zu deferred Providern.

Verwaltung der Versionskompatibilität

Strategien für den Umgang mit Major-Updates von Laravel und PHP sowie Konfiguration der Testmatrix in GitHub Actions.
Zuletzt geändert am 14. Oktober 2026