Ga naar inhoud

NextPDF Laravel-boot en automatische detectie

Laravel detecteert NextPdfServiceProvider automatisch op basis van de composer.json van het package. De provider registreert uitgestelde container-bindings en publiceert het configuratiebestand in een consolecontext. Deze pagina legt uit hoe de detectie werkt en wat de levensduur van elke binding is.

Terminal window
composer require nextpdf/laravel
php artisan vendor:publish --tag=nextpdf-config

Het package declareert zijn provider en facade-alias in het extra.laravel-blok van de eigen composer.json:

resource: composer.json (extra.laravel)
{
"extra": {
"laravel": {
"providers": [
"NextPDF\\Laravel\\NextPdfServiceProvider"
],
"aliases": {
"Pdf": "NextPDF\\Laravel\\Facades\\Pdf"
}
}
}
}

Bij het uitvoeren van composer require leest Laravel dit blok en registreert daarna de provider en de alias. Handmatige bewerking van config/app.php of bootstrap/providers.php is niet nodig. De array extra.laravel.providers registreert serviceproviders automatisch en extra.laravel.aliases registreert facade-aliassen automatisch (Laravel 12-handleiding voor packageontwikkeling, https://laravel.com/docs/12.x/packages, geraadpleegd op 2026-05-18).

NextPdfServiceProvider implementeert DeferrableProvider en de standaard register()- / boot()-levenscyclus.

  1. register() voegt de packageconfiguratie samen onder de sleutel nextpdf. Vervolgens bindt de methode de container-entries: lettertyperegister, afbeeldingsregister, documentfactory, PHP Standards Recommendation 18 (PSR-18) Hypertext Transfer Protocol (HTTP)-client, timestamp-client, signer, document en e-factuurcontracten. Elke binding is een closure, dus er worden hier geen zware objecten geconstrueerd.
  2. boot() controleert of de PHP-extensies mbstring en zlib geladen zijn. De methode registreert de publiceerbare configuratie onder de tag nextpdf-config alleen wanneer runningInConsole() waar is.

Omdat de provider uitgesteld is, draait register() pas wanneer een van de entries wordt opgelost die door provides() worden geretourneerd. Het oplossen van een niet-gerelateerde containersleutel boot NextPDF niet.

PHP Standards Recommendation 11 (PSR-11) staat toe dat twee opeenvolgende get()-aanroepen met dezelfde identifier verschillende waarden retourneren, afhankelijk van de bindingstrategie (PSR-11 §1.1.2). De provider vertrouwt bewust op dit gedrag:

BindingsleutelLevensduurOpmerkingen
FontRegistryInterface (+ alias FontRegistry)singleton, vergrendeld na warmupOpgewarmd vanuit preload_fonts; vergrendeld zodat geen enkel verzoek het kan muteren
ImageRegistrysingletonBegrensde least recently used (LRU)-cache; de grootte wordt bepaald door image_cache_mb; niet vergrendeld
DocumentFactoryInterface (+ alias DocumentFactory)singletonStateless; deelt de twee registers
Psr\Http\Client\ClientInterfacesingletonClient die rekening houdt met request forgery en een curl-client omhult; opgebouwd uit tsa.*
TsaClientscopednull wanneer tsa.url leeg is
SignerInterfacefactorynull wanneer ondertekening is uitgeschakeld of het certificaat leeg is
PdfDocumentInterface (+ alias nextpdf)factoryNieuwe NextPDF\Core\Document per resolve, met standaardmetadata al toegepast
EmbedderInterface, ValidatorInterface, ProfileInterface, SchematronRunnerInterfacefactoryLost op naar Premium-concretes; geeft een fout bij de eerste resolve zonder nextpdf/premium

De documentbinding past defaults.creator, defaults.language en, indien niet leeg, defaults.author toe op elk nieuw document. Wanneer pdfa niet null is, schakelt de binding PDF/A in (Premium). Wanneer de sectie artisan aanwezig is en er een Chrome-browserfactoryklasse bestaat, past de binding de Chrome-weergaveconfiguratie toe.

has() op de container accepteert één enkele string-identifier (PSR-11 §1.1.2). De e-factuurcontracten zijn gebonden, dus has() retourneert daarvoor true, zelfs wanneer Premium afwezig is. De ontbrekende concrete geeft pas tijdens constructie een fout.

Voeg het package toe aan de dont-discover-array van de applicatie en registreer de provider vervolgens handmatig:

resource: application composer.json
{
"extra": {
"laravel": {
"dont-discover": ["nextpdf/laravel"]
}
}
}
resource: bootstrap/providers.php
<?php
declare(strict_types=1);
return [
App\Providers\AppServiceProvider::class,
NextPDF\Laravel\NextPdfServiceProvider::class,
];

Elke sleutel wordt in deze volgorde opgelost: omgevingsvariabele → gepubliceerde waarde in config/nextpdf.php → packagestandaard die bij register() wordt samengevoegd. De meeste sleutels accepteren een NEXTPDF_*-naam of een verouderde TCPDF_*-omgevingsnaam. Geef de voorkeur aan NEXTPDF_*.

Terminal window
php artisan package:discover --ansi

Een regel die nextpdf/laravel vermeldt, bevestigt de detectie. Omdat de provider uitgesteld is, verschijnen de bindings zelf pas bij de eerste resolve. De detectieregel is het juiste successignaal.

  • De configuratiepublicatie registreert alleen in een consolecontext, dus een verzoek dat uitsluitend via het web binnenkomt, activeert het nooit. Voer vendor:publish uit vanuit de command-line interface (CLI).
  • Naast de sleutels voor het register, de factory, de HTTP-client, de signer, de timestamp en het document bevat provides() de vier sleutels voor e-factuurcontracten.
  • Een verse installatie kan inert lijken tot de eerste relevante resolve. Dit is het ontwerp van de uitgestelde provider, geen fout.

register() is O(1), omdat het uitsluitend closures aanmaakt. De warmup van het lettertyperegister is O(f) ten opzichte van vooraf geladen lettertypen en draait eenmaal per workerproces. Door de provider uit te stellen blijven de constructiekosten van NextPDF buiten het bootpad van het framework totdat een binding daadwerkelijk wordt gebruikt.

Het uitgestelde ontwerp verkleint het aanvalsoppervlak tijdens het booten. Het vergrendelde lettertyperegister voorkomt dat het ene verzoek de lettertypestatus voor een ander verzoek wijzigt in langlevende workers. Voor volledige dekking van dreigingen, zie /integrations/laravel/security-and-operations/.

BeweringBronClausulereference_id
Opeenvolgende resoluties kunnen verschillen afhankelijk van de bindingstrategiePSR-11 Container§1.1.2
has() neemt één string-identifierPSR-11 Container§1.1.2

De officiële Laravel 12-package-documentatie bevestigt de namen van de Laravel-detectiesleutels (https://laravel.com/docs/12.x/packages, geraadpleegd op 2026-05-18).

Premium-concretes lossen op via dezelfde uitgestelde bindingsleutels. Deze optionele Enterprise-functionaliteit vereist geen codewijziging in het Core-package dat hier wordt beschreven. Zie https://nextpdf.dev/get-license/?intent=laravel-signing.

  • /integrations/laravel/install/ — installeren en publiceren
  • /integrations/laravel/overview/ — packagearchitectuur
  • /integrations/laravel/integration/ — end-to-end wiring-handleiding
  • /integrations/laravel/configuration/ — elke configuratiesleutel