Skip to main content

Wat is een package?

Een package in Laravel is een Composer-package dat functionaliteit toevoegt aan je applicatie. Er zijn grofweg twee soorten packages:
  • Standalone packages — generieke PHP-libraries die niet van Laravel afhankelijk zijn (bijvoorbeeld Carbon, Pest)
  • Laravel-packages — packages met functionaliteit die met Laravel is geïntegreerd, zoals routes, controllers, views en configuratie
Deze gids behandelt de tweede soort: het ontwikkelen van Laravel-specifieke packages. Voor packageontwikkeling heb je diepgaande kennis nodig van de interne structuur van Laravel, zoals service providers, facades en het publiceren van configuratiebestanden.
Voor het schrijven van tests voor je package gebruik je Orchestra Testbench. Je kunt packagetests schrijven zoals je dat in een gewone Laravel-applicatie doet.

Automatische detectie van packages

Wanneer een package wordt geïnstalleerd, leest Laravel de sectie extra.laravel uit composer.json en registreert de service providers en facades automatisch.
Met deze configuratie wordt je package automatisch geladen, zonder dat gebruikers bootstrap/providers.php handmatig hoeven aan te passen.
Hoe deze automatische detectie is geïmplementeerd en wanneer de cache opnieuw wordt opgebouwd, lees je in detail in De interne structuur van package discovery.

Automatische detectie uitschakelen

Als een gebruiker de automatische detectie van een specifiek package wil uitschakelen, stelt die dat in de composer.json van de applicatie in.

De rol van de service provider

De service provider is het toegangspunt van je package. Hier centraliseer je alle logica om resources zoals views, configuratie, migrations en routes bij Laravel te registreren. Een service provider erft van Illuminate\Support\ServiceProvider en heeft twee methodes: register en boot.
Registreer geen event listeners, routes of views in de register-methode. Je zou per ongeluk services kunnen gebruiken van een andere service provider die nog niet is geladen. Doe alles behalve bindings altijd in de boot-methode.
Zie Hooks na het resolven van packageservices om een service uit te breiden zonder deze aan te maken voordat hij wordt gebruikt, en om configuratie ook toe te passen als de service al is geresolved. Daar wordt uitgelegd wanneer callAfterResolving() wordt uitgevoerd en hoe je ontwerpt voor herhaalde toepassing. Zie Levensduur van packageservices ontwerpen voor registratiemethoden die ook in Octane en queue workers geen state meenemen. Daar worden de interne implementatie van scoped() en de aandachtspunten bij afhankelijkheden die een singleton vasthoudt uitgelegd.

Configuratiebestanden publiceren

publishes() — bestanden publiceren

Als je in de boot-methode publishes() aanroept, kunnen gebruikers met het vendor:publish-commando het configuratiebestand naar hun eigen applicatie kopiëren.
Na publicatie haal je de configuratiewaarden op zoals bij elke andere config-toegang.

mergeConfigFrom() — samenvoegen met standaardwaarden

Als je mergeConfigFrom() gebruikt in de register-methode, worden de standaardwaarden van het package ook gebruikt wanneer de gebruiker het configuratiebestand niet heeft gepubliceerd.
mergeConfigFrom() voegt geneste arrays niet tot op diepere niveaus samen. Bij configuraties met multidimensionale arrays kan het gebeuren dat, wanneer de gebruiker maar een deel definieert, de overige opties niet worden samengevoegd.
Het verschil met de recursieve vervangmethode van Laravel 13, de omgang met lijsten met numerieke sleutels en de updatestappen wanneer je de configuratiecache gebruikt, worden uitgelegd in Packageconfiguratie samenvoegen en cachen.

Publicatiegroepen scheiden met tags

Als je een tag opgeeft als tweede argument van publishes(), kunnen gebruikers alleen de resources publiceren die ze nodig hebben.

Routes registreren

Laad routebestanden met loadRoutesFrom(). Als de routecache van de applicatie actief is, wordt dit automatisch overgeslagen.
In het routebestand verwijs je naar de controllers van het package.
Hoe je middleware expliciet opgeeft, botsingen van URI’s en routenamen voorkomt en configuratiewijzigingen in de cache verwerkt, wordt uitgelegd in Routes van packages registreren en cachen.

Migrations publiceren

Met publishesMigrations() registreer je migrationbestanden om te publiceren. In de standaardconfiguratie van Laravel 13 is database.migrations.update_date_on_publish ingeschakeld, waardoor de timestamp in de bestandsnaam bij publicatie wordt bijgewerkt. Als de instelling is uitgeschakeld of ontbreekt, gebeurt dit niet.
Wanneer je publiceert of direct laadt, wanneer timestamps veranderen, de risico’s van opnieuw publiceren en schemawijzigingen voor bestaande gebruikers worden uitgelegd in Migrations van packages publiceren en bijwerken.

Views publiceren

loadViewsFrom() — views registreren

Registreer de viewsmap met loadViewsFrom(). Met de namespace uit het tweede argument verwijs je naar views in het formaat package::view.
Na registratie verwijs je naar views via de package-namespace.
Laravel zoekt views op twee plekken. Eerst controleert het de map resources/views/vendor/courier van de applicatie; als die er niet is, gebruikt het de viewsmap van het package. Zo kunnen gebruikers de views aanpassen. De zoekvolgorde in de implementatie en de terugval per bestand, hoe je wijzigingen bij gepubliceerde templates krijgt en het verschil met de Blade-cache worden uitgelegd in Views van packages overschrijven en bijwerken.

Views publiceren

Blade-componenten registreren

Als je componenten in je package opneemt, registreer je die in de boot-methode.
Je kunt ook in één keer registreren via een componentnamespace.

Publieke assets distribueren

Om de JavaScript, CSS en afbeeldingen van je package te distribueren, registreer je met publishes() een kopie naar bijvoorbeeld public_path('vendor/courier'). Als je het package bijwerkt, veranderen al gepubliceerde bestanden niet automatisch. Het filteren op tag en provider, het verschil tussen --force en --existing, de afhandeling van verwijderde bestanden en updates via laravel-assets worden uitgelegd in Publieke assets van packages publiceren en bijwerken.

Vertaalbestanden publiceren

Registreer vertaalbestanden met loadTranslationsFrom(). Naar vertalingen verwijs je in het formaat package::file.key.
Voor JSON-vertaalbestanden gebruik je loadJsonTranslationsFrom().
Het gedeeltelijk overschrijven van PHP-vertalingen, de laadvolgorde en overschrijvingslocatie van JSON-vertalingen, en de compatibiliteit van vertaalsleutels en het bijwerken van gepubliceerde bestanden worden uitgelegd in Packagevertalingen overschrijven en bijwerken.

Commando’s registreren

Artisan-commando’s van je package registreer je met de commands()-methode. Het is gebruikelijk om ze alleen in de console-omgeving te registreren.

Integratie met het optimize-commando

Als je package een eigen cache heeft, kun je met de optimizes()-methode integreren met php artisan optimize en php artisan optimize:clear.
Het registreren van commandoklassen en het registreren van optimalisatietaken zijn afzonderlijke handelingen. Botsende registratiesleutels, uitsluiten met --except, de uitvoeringsvolgorde ten opzichte van de standaardtaken en exitcodes bij fouten worden uitgelegd in Packagecaches integreren in optimize.

Informatie toevoegen aan het about-commando

Gebruik AboutCommand::add() om package-informatie toe te voegen aan de uitvoer van php artisan about.
Wanneer de gegevens worden geëvalueerd, --only en JSON-uitvoer, een ontwerp zonder geheimen in de uitvoer en de registratiestatus in tests worden uitgelegd in Diagnostische package-informatie toevoegen aan about.

Een facade maken

Met een facade kun je een binding uit de service container aanroepen alsof het statische methodes zijn.
1

Maak een serviceklasse

2

Maak een facade-klasse

Erf van Illuminate\Support\Facades\Facade en geef in getFacadeAccessor() de bindingssleutel van de service container terug.
3

Bind in de service provider

4

Registreer in composer.json

Door PHPDoc-@method-annotaties aan de facademethodes toe te voegen, werkt de autocomplete van je IDE.

DeferrableProvider — lazy loading implementeren

Een provider die alleen bindings aan de service container toevoegt, kan lazy loading realiseren door de interface DeferrableProvider te implementeren. Omdat de provider pas wordt geladen wanneer de service echt nodig is, verbetert de performance van je applicatie.
Laravel compileert en bewaart de lijst van services die deferred providers aanbieden. De provider wordt alleen geladen wanneer een van de services uit provides() wordt opgelost.
Gebruik DeferrableProvider niet voor providers die resources moeten registreren (views, routes, event listeners, enz.). Bij lazy loading blijven die resources anders ongeregistreerd.

Packages testen

Om je package op zichzelf te testen gebruik je Orchestra Testbench. Je kunt packagetests schrijven alsof je in een gewone Laravel-applicatie zit.
Overschrijf in je testcase getPackageProviders() om de service provider van je package te registreren.

Publiceren op Composer

Best practices voor het publiceren van je package op Packagist. Basisconfiguratie van composer.json
Door afhankelijk te zijn van illuminate/support in plaats van heel illuminate/framework, neem je alleen de Laravel-componenten op die je nodig hebt. Houd de dependency tree van je package klein.
Voorbeeld van een directorystructuur

Gerelateerde pagina’s

Service providers

Bekijk de details van de register- en boot-methodes van service providers en van deferred providers.

Versiecompatibiliteit beheren

Uitleg over strategieën voor major-upgrades van Laravel en PHP en de testmatrixconfiguratie van GitHub Actions.
Laatst gewijzigd op 14 oktober 2026