NextPDF Artisan – Boot und Discovery
Auf einen Blick
Abschnitt betitelt „Auf einen Blick“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.
Wie Discovery funktioniert
Abschnitt betitelt „Wie Discovery funktioniert“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.
Boot-Sequenz
Abschnitt betitelt „Boot-Sequenz“Es gibt keinen Bootstrap-Kernel, keine Befehlsregistrierung und keine Deferred-Provider-Phase. Der erste Aufruf von writeHtmlChrome() ist der Einstieg in den gesamten Lebenszyklus.
Container-Bindungen
Abschnitt betitelt „Container-Bindungen“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/.
Containerlose Service-Auflösung
Abschnitt betitelt „Containerlose Service-Auflösung“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:
| Methode | Gibt zurück | Wenn 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.
Reihenfolge der Konfigurationsauflösung
Abschnitt betitelt „Reihenfolge der Konfigurationsauflösung“Es gibt keine Konfigurationsdateikaskade. Die Konfiguration ist genau das, was Sie an ChromeRendererConfig übergeben:
- Explizite Konstruktor-Argumente, oder
ChromeRendererConfig::fromArray()aus einem vom Host bereitgestellten Array (snake_case-Schlüssel; nicht gesetzte Schlüssel fallen auf die Konstruktor-Standardwerte zurück;chrome_binarywird 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/.
Diagnose
Abschnitt betitelt „Diagnose“- „Ist die Brücke auffindbar?“ – wenn
class_exists(\NextPDF\Artisan\PageImporter::class)trueist, 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üfung –
EInvoiceServiceFactory::makeEmbedder() === nullbedeutet, dass die Pro-Stufe nicht installiert ist; der Open-Source-Render-Pfad bleibt davon unberührt.
Siehe auch
Abschnitt betitelt „Siehe auch“- /integrations/artisan/integration/
- /integrations/artisan/overview/
- /integrations/artisan/configuration/
- /integrations/artisan/production-usage/
- /integrations/artisan/troubleshooting/