Ga naar inhoud

NextPDF Artisan: opstarten en detectie

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.

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.

no

yes

Composer autoload (PSR-4)

Application constructs Document

Document::setChromeRendererConfig(config)

Document::writeHtmlChrome(html)

class_exists PdfReader

and PageImporter?

core raises layout exception

resolve ChromeHtmlRenderer

render → parse → import Form XObject

Diagram

Artisan heeft geen bootstrap-kernel, commandregistratie of deferred-providerfase. De eerste aanroep van writeHtmlChrome() is het volledige instappunt van de levenscyclus.

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/.

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:

MethodeRetourneertBij 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.

Er is geen cascade van configuratiebestanden. Configuratie bestaat precies uit wat aan ChromeRendererConfig wordt doorgegeven:

  1. Constructorargumenten die expliciet worden doorgegeven, of
  2. ChromeRendererConfig::fromArray() vanuit een door de host geleverde array (snake-case-sleutels; niet-ingestelde sleutels vallen terug op de standaardwaarden van de constructor; chrome_binary is 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.

  • “Is de bridge detecteerbaar?” — als class_exists(\NextPDF\Artisan\PageImporter::class) gelijk is aan true, 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 containerEInvoiceServiceFactory::makeEmbedder() === null betekent dat het Pro-niveau niet is geïnstalleerd; het open source-renderpad blijft onaangetast.
  • /integrations/artisan/integration/
  • /integrations/artisan/overview/
  • /integrations/artisan/configuration/
  • /integrations/artisan/production-usage/
  • /integrations/artisan/troubleshooting/