Lewati ke konten

Boot dan penemuan pada NextPDF Artisan

Artisan adalah pustaka biasa yang mengikuti PHP Standard Recommendation 4 (PSR-4). Artisan tidak memiliki service provider, bundle, atau manifes auto-discovery milik framework. Artisan melakukan boot begitu class-class-nya dapat di-autoload. Penemuan berarti peta PSR-4 milik Composer, tidak lebih.

Paket composer.json mendeklarasikan dua root PSR-4: NextPDF\Artisan\src/Artisan/ dan NextPDF\Parser\src/Parser/. Paket ini tidak menyertakan extra.laravel, class bundle Symfony, atau registrar CodeIgniter. Tidak ada proses yang melakukan scan, registrasi, atau hook selama boot.

Titik integrasinya berada di nextpdf/core. Document (melalui concern HasTextOutput) mengekspos writeHtmlChrome(), yang memeriksa class_exists() pada runtime untuk NextPDF\Parser\PdfReader dan NextPDF\Artisan\PageImporter. Ketika autoloader dapat me-resolve kedua class tersebut, jalur Chrome tersedia. Ketika tidak dapat melakukannya, core memunculkan exception tata letak alih-alih gagal karena fatal error. Karena itu, penemuan hanya menjawab satu pertanyaan: apakah class-class Artisan ada di autoloader? Composer yang menjawabnya; tidak ada mesin framework yang terlibat.

Ini disengaja. Bridge ini adalah kapabilitas yang dijangkau engine inti melintasi batas paket, bukan service yang dikelola framework. Anda dapat menggunakan Artisan dengan cara yang sama di Laravel, Symfony, CodeIgniter, skrip command-line interface (CLI), atau queue worker, karena tidak satu pun dari host tersebut menjadi prasyarat.

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 tidak memiliki kernel bootstrap, registrasi command, atau fase deferred-provider. Pemanggilan pertama ke writeHtmlChrome() merupakan seluruh titik masuk siklus hidupnya.

Artisan tidak memiliki kontainer dependency injection (DI) dan tidak meregistrasi binding apa pun. Komponen-komponennya berupa objek biasa yang di-inject melalui constructor: buat sebuah ChromeRendererConfig, teruskan ke ChromeHtmlRenderer, dan secara opsional inject logger PSR-3 serta HtmlSecurityPolicyInterface kustom. Di dalam kontainer host, registrasikan sendiri ChromeHtmlRenderer sebagai singleton; lihat contohnya di /integrations/artisan/production-usage/.

Beberapa kapabilitas NextPDF, termasuk kontrak e-invoice Premium, biasanya di-resolve melalui kontainer framework. Artisan juga berjalan di lingkungan tanpa kontainer, seperti tool CLI, skrip mandiri, dan runner kustom, sehingga Artisan menyertakan EInvoiceServiceFactory:

MetodeMengembalikanSaat null
makeEmbedder()EmbedderInterface (Pro)Tier Pro tidak terpasang
makeValidator()ValidatorInterface (Enterprise)Tier Enterprise tidak terpasang
makeDefaultProfile()ProfileInterface (EN16931, Pro)Tier Pro tidak terpasang
makeSchematronRunner()SchematronRunnerInterface (Enterprise)Tier Enterprise tidak terpasang

Setiap pemanggilan mengembalikan instance yang baru. Perilaku sekali pakai ini penting karena pemanggilan embed dan validate memiliki konteks parsing Extensible Markup Language (XML) yang dapat berubah dan tidak boleh berbagi state. Factory ini adalah kemudahan untuk kasus tanpa kontainer yang jarang terjadi, bukan service locator. Pola yang lebih disarankan adalah tetap menyusun objek saat konstruksi dan meneruskannya sebagai argumen constructor. Mengembalikan null ketika sebuah tier tidak ada mencerminkan paket wrapper framework, sehingga kode pemanggil yang sama berjalan dengan atau tanpa Premium. Sumber: src/Artisan/EInvoiceServiceFactory.php; diuji secara integrasi di tests/Integration/Artisan/EInvoiceServiceFactoryIntegrationTest.php.

Tidak ada kaskade berkas konfigurasi. Konfigurasi persis sama dengan apa yang Anda teruskan ke ChromeRendererConfig:

  1. Argumen constructor yang Anda teruskan secara eksplisit, atau
  2. ChromeRendererConfig::fromArray() dari array yang disediakan host (kunci snake-case; kunci yang tidak diatur akan kembali ke nilai default constructor; chrome_binary hanya berlaku bila berupa string yang tidak kosong).

Konfigurasi yang telah di-resolve tidak berubah selama masa hidup renderer. Lihat /integrations/artisan/configuration/ untuk setiap kunci.

  • “Apakah bridge dapat ditemukan?” — jika class_exists(\NextPDF\Artisan\PageImporter::class) bernilai true, autoloader Composer dapat menemukannya, dan core akan menggunakan jalur Chrome.
  • “Apakah ia sudah boot?” — tidak ada fase boot yang bisa gagal; dependensi yang hilang muncul pada pemanggilan pertama ke writeHtmlChrome() sebagai exception bertipe, yang dipetakan di /integrations/artisan/troubleshooting/.
  • Pemeriksaan Premium tanpa kontainerEInvoiceServiceFactory::makeEmbedder() === null berarti tier Pro tidak terpasang; jalur render open-source tidak terpengaruh.
  • /integrations/artisan/integration/
  • /integrations/artisan/overview/
  • /integrations/artisan/configuration/
  • /integrations/artisan/production-usage/
  • /integrations/artisan/troubleshooting/