Zum Inhalt springen

NextPDF Artisan – Boot und Discovery

Artisan ist eine reine PSR-4-Bibliothek ohne Service-Provider, ohne Bundle und ohne Framework-Autodiscovery-Manifest. Es „bootet“, sobald seine Klassen autoladbar sind; Discovery ist die PSR-4-Map von Composer, mehr nicht.

Das Paket composer.json deklariert zwei PSR-4-Wurzeln – NextPDF\Artisan\src/Artisan/ und NextPDF\Parser\src/Parser/. Es gibt kein extra.laravel, keine Symfony-Bundle-Klasse und keinen CodeIgniter-Registrar. Beim Booten wird nichts gescannt, registriert oder eingebunden.

Der Integrationspunkt liegt bei nextpdf/core. Document (über das HasTextOutput-Concern) stellt writeHtmlChrome() bereit und führt zur Laufzeit eine class_exists()-Prüfung für NextPDF\Parser\PdfReader und NextPDF\Artisan\PageImporter durch. Wenn beide über den Autoloader auflösbar sind, steht der Chrome-Pfad zur Verfügung. Andernfalls wirft core eine Layout-Exception, statt fatal zu scheitern. „Discovery“ bedeutet also: Sind die Artisan-Klassen im Autoloader? Diese Frage beantwortet Composer – es ist keine Framework-Maschinerie beteiligt.

Das ist bewusst so entworfen. Die Brücke ist eine Fähigkeit, auf die die Core-Engine über eine Paketgrenze hinweg zugreift, kein vom Framework verwalteter Service. Dadurch bleibt Artisan in Laravel, Symfony, CodeIgniter, einem CLI-Skript oder einem Queue-Worker auf dieselbe Weise nutzbar, weil keines davon vorausgesetzt wird.

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

Es gibt keinen Bootstrap-Kernel, keine Befehlsregistrierung und keine Deferred-Provider-Phase. Der erste Aufruf von writeHtmlChrome() ist der Einstieg in den gesamten Lebenszyklus.

Artisan hat keinen DI-Container und registriert keine Bindungen. Komponenten sind einfache Objekte mit Konstruktorinjektion: Erstellen Sie einen ChromeRendererConfig, übergeben Sie ihn an ChromeHtmlRenderer, und injizieren Sie optional einen PSR-3-Logger sowie ein eigenes HtmlSecurityPolicyInterface. Registrieren Sie in einem Host-Container ChromeHtmlRenderer selbst als Singleton – siehe das Beispiel unter /integrations/artisan/production-usage/.

Manche Fähigkeiten von NextPDF (Premium-E-Invoice-Verträge) werden normalerweise über einen Framework-Container aufgelöst. Artisan läuft auch in containerlosen Umgebungen – CLI-Tools, eigenständige Skripte, eigene Runner – und bringt deshalb EInvoiceServiceFactory mit:

MethodeGibt zurückWenn null
makeEmbedder()EmbedderInterface (Pro)Pro-Stufe nicht installiert
makeValidator()ValidatorInterface (Enterprise)Enterprise-Stufe nicht installiert
makeDefaultProfile()ProfileInterface (EN16931, Pro)Pro-Stufe nicht installiert
makeSchematronRunner()SchematronRunnerInterface (Enterprise)Enterprise-Stufe nicht installiert

Jeder Aufruf gibt eine frische Instanz zurück (Use-once-Semantik – Embed- und Validate-Aufrufe besitzen einen veränderlichen XML-Parse-Kontext und dürfen keinen Zustand teilen). Die Factory ist eine Bequemlichkeit für den seltenen containerlosen Fall, kein Service-Locator. Das bevorzugte Muster bleibt, Objekte bei der Konstruktion zusammenzusetzen und sie als Konstruktor-Argumente zu übergeben. Dass bei Abwesenheit null zurückgegeben wird, entspricht den Framework-Wrapper-Paketen, sodass derselbe aufrufende Code mit oder ohne Premium läuft. Quelle: src/Artisan/EInvoiceServiceFactory.php; integrationsgetestet in tests/Integration/Artisan/EInvoiceServiceFactoryIntegrationTest.php.

Es gibt keine Konfigurationsdateikaskade. Die Konfiguration ist genau das, was Sie an ChromeRendererConfig übergeben:

  1. Explizite Konstruktor-Argumente, oder
  2. ChromeRendererConfig::fromArray() aus einem vom Host bereitgestellten Array (snake_case-Schlüssel; nicht gesetzte Schlüssel fallen auf die Konstruktor-Standardwerte zurück; chrome_binary wird nur angewendet, wenn es ein nicht-leerer String ist).

Die aufgelöste Konfiguration ist für die Lebensdauer des Renderers unveränderlich. Alle Schlüssel finden Sie unter /integrations/artisan/configuration/.

  • „Ist die Brücke auffindbar?“ – wenn class_exists(\NextPDF\Artisan\PageImporter::class) true ist, hat der Autoloader von Composer sie; core nutzt dann den Chrome-Pfad.
  • „Hat es gebootet?“ – es gibt keinen Boot, der scheitern könnte; eine fehlende Abhängigkeit zeigt sich beim ersten Aufruf von writeHtmlChrome() als typisierte Exception, wie unter /integrations/artisan/troubleshooting/ beschrieben.
  • Containerlose Premium-PrüfungEInvoiceServiceFactory::makeEmbedder() === null bedeutet, dass die Pro-Stufe nicht installiert ist; der Open-Source-Render-Pfad bleibt davon unberührt.
  • /integrations/artisan/integration/
  • /integrations/artisan/overview/
  • /integrations/artisan/configuration/
  • /integrations/artisan/production-usage/
  • /integrations/artisan/troubleshooting/