Skip to main content

Was ist ein Paket?

Ein Paket in Laravel ist ein Composer-Paket, das die Anwendung um Funktionalität erweitert. Es gibt zwei Arten:
  • Standalone-Pakete — universelle PHP-Bibliotheken ohne Laravel-Abhängigkeit (z. B. Carbon, Pest).
  • Laravel-Pakete — Pakete mit Laravel-integrierten Bausteinen wie Routen, Controllern, Views oder Konfiguration.
Diese Anleitung behandelt Letztere: die Entwicklung Laravel-spezifischer Pakete. Sie erfordert ein solides Verständnis interner Laravel-Konzepte wie Service Provider, Facades und der Veröffentlichung von Konfigurationsdateien.
Für Pakettests nutzen Sie Orchestra Testbench. Damit lassen sich Pakettests genauso schreiben wie in einer normalen Laravel-Anwendung.

Auto-Discovery für Pakete

Bei der Installation liest Laravel den Abschnitt extra.laravel aus der composer.json und registriert Service Provider und Facades automatisch.
Mit dieser Einstellung müssen Nutzer die bootstrap/providers.php nicht anpassen — das Paket wird automatisch geladen.

Auto-Discovery deaktivieren

Wollen Nutzer die Erkennung für ein bestimmtes Paket deaktivieren, tragen sie es in der composer.json ihrer Anwendung ein.

Rolle des Service Providers

Der Service Provider ist der Einstiegspunkt Ihres Pakets. Hier bündeln Sie die Registrierung von Views, Konfiguration, Migrationen, Routen und weiteren Ressourcen. Ein Service Provider erbt von Illuminate\Support\ServiceProvider und hat zwei Methoden: register und boot.
Registrieren Sie im register-Methodenkörper keine Event-Listener, Routen oder Views. Sie könnten Services eines noch nicht geladenen Providers unabsichtlich aufrufen. Alles außer Bindings gehört in boot.

Konfigurationsdateien veröffentlichen

publishes() — Dateien veröffentlichen

Ein Aufruf von publishes() in boot erlaubt Nutzern, Dateien über vendor:publish in die eigene Anwendung zu kopieren.
Auf veröffentlichte Werte greifen Sie ganz normal per config-Helper zu.

mergeConfigFrom() — mit Defaults mergen

Mit mergeConfigFrom() in register gelten Paket-Defaults auch dann, wenn der Nutzer die Datei nicht veröffentlicht hat.
mergeConfigFrom() merged nicht tief in verschachtelte Arrays. Bei mehrdimensionalen Konfigurationen können vom Nutzer nur teilweise definierte Bereiche fehlende Optionen zurücklassen.

Veröffentlichungsgruppen per Tag

Mit dem zweiten Argument von publishes() können Nutzer gezielt einzelne Ressourcengruppen veröffentlichen.

Routen registrieren

loadRoutesFrom() lädt eine Routen-Datei. Bei aktiver Routen-Cache-Kompilierung der Anwendung wird der Aufruf automatisch übersprungen.
In der Routen-Datei referenzieren Sie Ihre Paket-Controller.

Migrationen veröffentlichen

Mit publishesMigrations() veröffentlichen Sie Migrationen. Laravel aktualisiert dabei die Zeitstempel automatisch.

Views veröffentlichen

loadViewsFrom() — Views registrieren

Registrieren Sie das View-Verzeichnis mit loadViewsFrom(). Über den Namensraum im zweiten Argument nutzen Sie Views wie package::view.
Nach der Registrierung greifen Sie über den Paket-Namensraum darauf zu:
Laravel sucht Views an zwei Orten: zuerst in resources/views/vendor/courier der Anwendung, ansonsten im Paketverzeichnis. So können Nutzer Views anpassen.

Views veröffentlichen

Blade-Komponenten registrieren

Bringt Ihr Paket Komponenten mit, registrieren Sie sie in boot.
Mit einem Komponenten-Namensraum registrieren Sie mehrere Komponenten auf einmal.

Übersetzungen veröffentlichen

Mit loadTranslationsFrom() registrieren Sie Übersetzungsdateien. Übersetzungen referenzieren Sie als package::file.key.
Für JSON-Übersetzungen verwenden Sie loadJsonTranslationsFrom().

Commands registrieren

Artisan-Commands Ihres Pakets registrieren Sie über commands() — üblicherweise nur im Console-Kontext.

In optimize einklinken

Hat Ihr Paket eigene Caches, integrieren Sie sich per optimizes() in php artisan optimize und php artisan optimize:clear.

Informationen im about-Command ergänzen

Mit AboutCommand::add() erweitern Sie die Ausgabe von php artisan about.

Facades erstellen

Mit einer Facade rufen Sie Container-Bindings wie statische Methoden auf.
1

Service-Klasse erstellen

2

Facade-Klasse erstellen

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

Im Service Provider binden

4

In composer.json registrieren

PHPDoc-@method-Annotationen ermöglichen IDE-Vervollständigung.

DeferrableProvider — Lazy Loading umsetzen

Provider, die nur Bindings vornehmen, können durch DeferrableProvider lazy geladen werden. Der Provider wird erst geladen, wenn der Service wirklich benötigt wird — das verbessert die Performance.
Laravel kompiliert und speichert die von Deferred Providern bereitgestellten Services. Nur wenn ein in provides() gelisteter Service aufgelöst wird, lädt Laravel den Provider.
Nutzen Sie DeferrableProvider nicht für Provider, die Ressourcen (Views, Routen, Event-Listener usw.) registrieren. Beim Deferring werden diese Ressourcen nicht registriert.

Pakete testen

Für den Test eines Pakets nutzen Sie Orchestra Testbench. Sie schreiben die Tests, als säßen Sie in einer normalen Laravel-Anwendung.
Registrieren Sie den Service Provider Ihres Pakets, indem Sie getPackageProviders() überschreiben.

Veröffentlichung auf Composer

Best Practices für die Veröffentlichung auf Packagist. Grundkonfiguration der composer.json
Mit einer Abhängigkeit zu illuminate/support (statt zum kompletten illuminate/framework) binden Sie nur die benötigten Komponenten ein. Halten Sie den Abhängigkeitsbaum Ihres Pakets klein.
Beispiel für die Verzeichnisstruktur

Verwandte Seiten

Service Provider

Details zu register/boot sowie zu Deferred Providern.

Versionskompatibilität verwalten

Strategien für Laravel-/PHP-Major-Upgrades und die Testmatrix in GitHub Actions.
Zuletzt geändert am 13. Juli 2026