NextPDF Artisan: opstarten en detectie
In een oogopslag
Sectie met titel “In een oogopslag”Artisan is een reguliere bibliotheek die PHP Standard Recommendation 4 (PSR-4) volgt. Het heeft geen service provider, bundle of manifest voor automatische frameworkdetectie. Het start op zodra de bijbehorende klassen via autoloading beschikbaar zijn. Detectie bestaat uit de PSR-4-mapping van Composer, en niets meer.
Hoe detectie werkt
Sectie met titel “Hoe detectie werkt”De composer.json van het pakket declareert twee PSR-4-roots: NextPDF\Artisan\ → src/Artisan/ en NextPDF\Parser\ → src/Parser/. Het bevat geen extra.laravel, Symfony-bundleklasse of CodeIgniter-registrar. Tijdens het opstarten wordt er niets gescand, geregistreerd of gekoppeld.
Het integratiepunt bevindt zich in nextpdf/core. Document stelt via concern HasTextOutput writeHtmlChrome() beschikbaar, dat tijdens runtime met class_exists() controleert op NextPDF\Parser\PdfReader en NextPDF\Artisan\PageImporter. Wanneer de autoloader beide klassen kan resolveren, is het Chrome-pad beschikbaar. Wanneer dat niet lukt, werpt core een lay-out-exception in plaats van met een fatale fout te falen. Detectie stelt daarom één vraag: staan de Artisan-klassen in de autoloader? Composer beantwoordt die vraag; er komt geen framework-machinerie aan te pas.
Dit is bewust zo ontworpen. De bridge is functionaliteit die de core-engine over een pakketgrens heen aanspreekt, geen door een framework beheerde service. Artisan is op dezelfde manier te gebruiken in Laravel, Symfony, CodeIgniter, een command-line interface (CLI)-script of een queue worker, omdat geen van die hosts vereist is.
Opstartvolgorde
Sectie met titel “Opstartvolgorde”Artisan heeft geen bootstrap-kernel, commandregistratie of deferred-providerfase. De eerste aanroep van writeHtmlChrome() is het volledige instappunt van de levenscyclus.
Container-bindings
Sectie met titel “Container-bindings”Artisan heeft geen dependency injection (DI)-container en registreert geen bindings. De componenten zijn gewone objecten die via de constructor worden geïnjecteerd: bouw een ChromeRendererConfig, geef die door aan ChromeHtmlRenderer en injecteer optioneel een PSR-3-logger en een aangepaste HtmlSecurityPolicyInterface. Registreer ChromeHtmlRenderer zelf als singleton in een host-container; zie het voorbeeld op /integrations/artisan/production-usage/.
Service-resolutie zonder container
Sectie met titel “Service-resolutie zonder container”Sommige functies van NextPDF, waaronder Premium e-invoice-contracten, worden doorgaans via een framework-container geresolveerd. Artisan draait ook in omgevingen zonder container, zoals CLI-tools, standalone scripts en aangepaste runners, en levert daarom EInvoiceServiceFactory mee:
| Methode | Retourneert | Bij null |
|---|---|---|
makeEmbedder() | EmbedderInterface (Pro) | Pro-niveau niet geïnstalleerd |
makeValidator() | ValidatorInterface (Enterprise) | Enterprise-niveau niet geïnstalleerd |
makeDefaultProfile() | ProfileInterface (EN16931, Pro) | Pro-niveau niet geïnstalleerd |
makeSchematronRunner() | SchematronRunnerInterface (Enterprise) | Enterprise-niveau niet geïnstalleerd |
Elke aanroep retourneert een nieuwe instantie. Dat is belangrijk, omdat embed- en validate-aanroepen werken met een wijzigbare Extensible Markup Language (XML)-parsecontext en geen status mogen delen. De factory is een hulpmiddel voor de zeldzame situatie zonder container, geen service locator. De voorkeursaanpak blijft om objecten bij de constructie samen te stellen en ze als constructorargumenten door te geven. Het retourneren van null wanneer een niveau ontbreekt, sluit aan bij de framework-wrapperpakketten, zodat dezelfde aanroepende code werkt met of zonder Premium. Bron: src/Artisan/EInvoiceServiceFactory.php; integratiegetest in tests/Integration/Artisan/EInvoiceServiceFactoryIntegrationTest.php.
Resolutievolgorde van configuratie
Sectie met titel “Resolutievolgorde van configuratie”Er is geen cascade van configuratiebestanden. Configuratie bestaat precies uit wat aan ChromeRendererConfig wordt doorgegeven:
- Constructorargumenten die expliciet worden doorgegeven, of
ChromeRendererConfig::fromArray()vanuit een door de host geleverde array (snake-case-sleutels; niet-ingestelde sleutels vallen terug op de standaardwaarden van de constructor;chrome_binaryis alleen van toepassing wanneer het een niet-lege string is).
De geresolveerde configuratie is onveranderlijk gedurende de levensduur van de renderer. Zie /integrations/artisan/configuration/ voor elke sleutel.
Diagnostiek
Sectie met titel “Diagnostiek”- “Is de bridge detecteerbaar?” — als
class_exists(\NextPDF\Artisan\PageImporter::class)gelijk is aantrue, kan de autoloader van Composer de klasse vinden en gebruikt core het Chrome-pad. - “Is het opgestart?” — er is geen opstartfase die kan falen; een ontbrekende afhankelijkheid komt bij de eerste aanroep van
writeHtmlChrome()naar voren als een getypeerde exception, zoals beschreven op /integrations/artisan/troubleshooting/. - Premium-controle zonder container —
EInvoiceServiceFactory::makeEmbedder() === nullbetekent dat het Pro-niveau niet is geïnstalleerd; het open source-renderpad blijft onaangetast.
Zie ook
Sectie met titel “Zie ook”- /integrations/artisan/integration/
- /integrations/artisan/overview/
- /integrations/artisan/configuration/
- /integrations/artisan/production-usage/
- /integrations/artisan/troubleshooting/