Contracts: 41 antarmuka publik (SPI)
Sekilas
Bagian berjudul “Sekilas”NextPDF\Contracts adalah antarmuka penyedia layanan (SPI) publik: 41 antarmuka dan enum di bawah src/Contracts/ dengan tanda @stability eksplisit serta jaminan kompatibilitas mundur. Paket ekstensi, jembatan framework, serta edisi Pro dan Enterprise bergantung pada tipe-tipe ini, bukan pada kelas konkret.
Pemasangan
Bagian berjudul “Pemasangan”composer require nextpdf/core:^3Tinjauan konseptual
Bagian berjudul “Tinjauan konseptual”Mesin ini mengekspos dua permukaan. Kelas konkret di bawah src/Core/, src/Html/, dan src/Writer/ tidak memiliki jaminan kompatibilitas dan dapat berubah di antara versi minor. Namespace Contracts bekerja secara berbeda. Namespace ini adalah kumpulan tipe terkurasi dengan tanda tangan yang dibekukan sesuai tingkat stabilitas yang dideklarasikan. Semua komponen di luar mesin bergantung pada namespace ini tanpa menjangkau lebih dalam. Cakupannya meliputi jembatan Laravel, Symfony, dan CodeIgniter, shim compat-tcpdf, NextPDF Server, serta edisi Pro dan Enterprise.
Setiap kontrak mendeklarasikan salah satu dari empat tingkat dalam PHPDoc-nya. Kontrak stable tidak mengizinkan perubahan yang merusak kompatibilitas pada rilis minor atau patch. Metode baru hanya diperkenalkan bersama implementasi standar. Kontrak experimental dapat berubah pada rilis minor dengan pemberitahuan penghentian (deprecation). Kontrak deprecated menyebutkan penggantinya. Sebagian kecil bersifat kontrak-saja, seperti StreamingWriterInterface dan CursorInterface. Tipe tersebut sudah diterbitkan dan dibekukan, tetapi belum ada implementasi produksi yang disertakan.
Daftar tingkat otoritatif adalah docs/extension-points.json (versi manifes 3.0.0, 67 titik yang diterbitkan di seluruh Contracts dan Event). Pengujian yang dapat diverifikasi mesin, tests/Unit/Contracts/StabilityContractTest.php, membaca manifes tersebut dan menggagalkan build pada lima kondisi. Pertama, tipe yang terdaftar tidak ada. Kedua, jenis hasil refleksi tidak sesuai dengan manifes. Ketiga, tanda PHPDoc @stability menyimpang dari manifes. Keempat, sebuah kontrak di bawah src/Contracts/ tidak ada dalam manifes. Kelima, tipe @internal masuk ke dalamnya. Permukaan kontrak tidak dapat menyimpang tanpa terdeteksi.
Kontrak terbagi ke dalam sembilan domain, masing-masing dibahas pada halaman tersendiri: konstruksi dokumen, penandatanganan, pengkodean barcode, tipografi, kebijakan keamanan, ekstraksi, observabilitas, dan streaming. Pembagian ini mencerminkan cara Anda mengadopsi mesin ini. Anda bergantung pada kontrak dokumen untuk menghasilkan berkas Portable Document Format (PDF). Anda bergantung pada kontrak penandatanganan untuk menambahkan tanda tangan. Anda bergantung pada kontrak kebijakan keamanan untuk membatasi HTML yang tidak tepercaya.
Resolusi implementasi opsional mengikuti satu pola di seluruh mesin. Core memeriksa keberadaan kelas konkret dengan class_exists() dan mengikatnya ke kontrak. LtvManagerInterface dan PdfAManagerInterface meresolusi implementasi Pro-nya dengan cara ini. Core tetap Apache-2.0 tanpa ketergantungan keras pada kode komersial.
Permukaan API
Bagian berjudul “Permukaan API”| Kontrak | Jenis | Stabilitas | Sejak | Domain |
|---|---|---|---|---|
PdfDocumentInterface | interface | stable | 1.0.0 | document |
DocumentFactoryInterface | interface | stable | 1.7.0 | document |
ResettableService | interface | stable | 1.7.0 | document |
OutputDestination | enum | stable | 1.0.0 | document |
Orientation | enum | stable | 1.0.0 | document |
Alignment | enum | stable | 1.0.0 | document |
SignerInterface | interface | stable | 1.0.0 | signing |
HsmSignerInterface | interface | stable | 1.0.0 | signing |
DeferredSignerInterface | interface | experimental | 3.0.0 | signing |
TimestampProviderInterface | interface | experimental | 3.0.0 | signing |
LtvManagerInterface | interface | stable | 1.10.0 | signing |
CryptoPolicyInterface | interface | stable | 1.9.0 | signing |
Barcode1DEncoderInterface | interface | stable | 1.0.0 | barcode |
Barcode2DEncoderInterface | interface | stable | 1.0.0 | barcode |
BarcodeEncoderInterface | interface | stable | 3.0.0 | barcode |
Gs1DataParserInterface | interface | stable | 1.0.0 | barcode |
FontRegistryInterface | interface | stable | 1.7.0 | typography |
TextPreprocessorInterface | interface | stable | 1.9.0 | typography |
HtmlSecurityPolicyInterface | interface | stable | 3.1.0 | security-policy |
ExternalResourcePolicyInterface | interface | stable | 4.0.0 | security-policy |
InspectorInterface | interface | experimental | 2.2.0 | extraction |
EmbeddingServiceInterface | interface | experimental | 2.1.0 | extraction |
VectorIndexInterface | interface | experimental | 2.1.0 | extraction |
JobNotificationInterface | interface | experimental | 2.2.0 | observability |
SpectrumInterface | interface | experimental | 2.1.0 | observability |
StreamingWriterInterface | interface | experimental | 3.1.0 | streaming |
CursorInterface | interface | experimental | 3.1.0 | streaming |
Tabel ini mencantumkan kontrak-kontrak utama. Tipe-tipe lainnya, termasuk objek transfer data (DTO) berbentuk value-object (TextSegment, TextPreprocessResult), sub-namespace EInvoice, enum perilaku (DegradationPolicy, UnderlineStyle), dan kontrak impor (ImportedFormObjectInterface, EmbeddedPdfObjectInterface, ChromeRenderResultInterface), didokumentasikan pada halaman domain di bawah Lihat juga. Daftar lengkap yang dapat dibaca mesin adalah docs/extension-points.json, yang dicerminkan ke .ai/contracts-map.md.
Contoh kode — Mulai cepat
Bagian berjudul “Contoh kode — Mulai cepat”<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();$doc->setTitle('Hello World');$doc->addPage();$doc->setFont('helvetica', '', 24);$doc->cell(0, 15, 'Hello, NextPDF!', newLine: true);$doc->save(__DIR__ . '/output/01-hello-world.pdf');Document::createStandalone() mengembalikan Document konkret yang memenuhi PdfDocumentInterface. Gunakan petunjuk tipe (type-hint) antarmuka di dalam layanan Anda agar internal mesin tetap dapat ditukar.
Contoh kode — Produksi
Bagian berjudul “Contoh kode — Produksi”<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\DocumentFactory;use NextPDF\Core\PdfFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Typography\FontRegistry;
// Created once at process boot in a RoadRunner/Swoole/Octane worker.$fontRegistry = new FontRegistry();$imageRegistry = new ImageRegistry(maxCacheBytes: 50 * 1024 * 1024);$documentFactory = new DocumentFactory($fontRegistry, $imageRegistry);
$factory = PdfFactory::new() ->withCompress(true) ->withDocumentFactory($documentFactory);
for ($request = 1; $request <= 3; $request++) { $doc = $factory->create(); $doc->setTitle("Worker Request #{$request}"); $doc->addPage(); $doc->setFont('helvetica', 'B', 16); $doc->cell(0, 12, "Worker Request #{$request}", newLine: true); $doc->save(__DIR__ . "/output/14-worker-request-{$request}.pdf");}DocumentFactory mengimplementasikan DocumentFactoryInterface. Factory ini menyimpan singleton FontRegistryInterface dan ImageRegistryInterface yang hidup sepanjang proses dan menyuntikkannya ke setiap Document sekali pakai, sehingga worker mengurai setiap fon sekali saja untuk ribuan permintaan.
Kasus tepi & jebakan
Bagian berjudul “Kasus tepi & jebakan”- Tipe kontrak-saja dapat dikompilasi tetapi tidak memiliki dukungan saat runtime. Ekspresi
newterhadapStreamingWriterInterfaceatauCursorInterfaceakan gagal karena belum ada kelas yang mengimplementasikannya. Perlakukan keduanya sebagai application programming interface (API) yang dideklarasikan di muka. - Tanda PHPDoc
@stabilityadalah sumber kebenaran untuk satu tipe.docs/extension-points.jsonadalah sumber kebenaran untuk himpunannya. Ketika keduanya bertentangan,StabilityContractTestgagal. Jangan sembunyikan pertentangan itu dengan menyunting salah satu sisi. experimentaltidak berarti tidak stabil dalam praktik. Itu berarti jaminan kompatibilitasnya lebih lemah. Baca bidangbc_promisesetiap kontrak di.ai/contracts-map.mdsebelum mengikatnya.- Kelas
@internaltidak pernah menjadi kontrak meskipun paket lain secara teknis dapat mereferensikannya. Pengujian stabilitas menolak setiap tipe@internalyang muncul dalam manifes. - Menambahkan metode ke antarmuka
stablemerupakan perubahan yang merusak kompatibilitas bagi para pengimplementasi kecuali metode itu disertai implementasi standar. Mesin menambahkan kemampuan melalui antarmuka baru, bukan dengan memperluas antarmuka yang sudah ada.
Kinerja
Bagian berjudul “Kinerja”Memprogram terhadap Contracts tidak menambah biaya runtime yang terukur: petunjuk tipe antarmuka diresolusi pada waktu penautan, bukan setiap pemanggilan. performance_budget untuk contoh worker pada halaman ini adalah 1500 ms wall dan puncak 64 MB untuk tiga dokumen. Penguraian fon pada permintaan pertama mendominasi anggaran tersebut. Permintaan berikutnya menggunakan kembali cache registri dan turun menjadi kerja terkait kontrak dalam orde milidetik satu digit. Model biayanya adalah O(1) per pengiriman kontrak; pekerjaannya berada di implementasi konkret, yang didokumentasikan pada setiap halaman domain.
Catatan keamanan
Bagian berjudul “Catatan keamanan”SPI juga merupakan batas keamanan. HtmlSecurityPolicyInterface dan ExternalResourcePolicyInterface adalah kontrak yang menolak secara baku (deny-by-default) dan membatasi apa yang dapat dilakukan HTML tidak tepercaya sebelum mencapai renderer. CryptoPolicyInterface mengatur pemilihan algoritme dan kekuatan kunci untuk penandatanganan dan enkripsi. Karena ini adalah kontrak, Anda dapat menyediakan kebijakan yang lebih ketat tanpa melakukan fork pada mesin. Ikat ke tingkat stable untuk kebijakan apa pun yang relevan dengan keamanan. Kontrak kebijakan eksperimental dapat berubah bentuk antarrilis minor. Halaman domain penandatanganan dan kebijakan keamanan memuat model ancaman lengkap serta referensi normatif.
Kesesuaian
Bagian berjudul “Kesesuaian”Tinjauan ini tidak membuat klaim normatif langsung; setiap halaman domain merender blok citations-nya sendiri. Kontrak penandatanganan dipetakan ke ISO 32000-2 §12.8 (tanda tangan digital) dan ETSI EN 319 142 (baseline PAdES). Manajer PDF/A dipetakan ke ISO 19005-4. Lihat halaman penandatanganan, kebijakan keamanan, dan ekstraksi untuk tabel kesesuaian tingkat klausa.
Konteks komersial
Bagian berjudul “Konteks komersial”Edisi Pro dan Enterprise menyediakan kode produksi di balik beberapa kontrak inti: LtvManagerInterface (validasi jangka panjang), PdfAManagerInterface (penegakan PDF/A), Hardware Security Module (HSM) dan penanda tangan yang ditangguhkan, encoder barcode, serta kontrak embedding dan vector-index. Core menerbitkan dan membekukan antarmuka; paket Premium mengirimkan implementasinya. Ini menjaga mesin sumber terbuka tetap Apache-2.0 dan memberi penerapan komersial peningkatan siap pakai tanpa perubahan API.
Lihat juga
Bagian berjudul “Lihat juga”- Contracts / Document — kontrak dokumen PDF, factory, dan registri.
- Contracts / Signing — kontrak signer, HSM, timestamp, dan validasi jangka panjang (LTV).
- Contracts / Security Policy — kontrak kebijakan kripto, HTML, dan sumber daya.
- Contracts / Typography — kontrak registri fon dan prapemrosesan teks.
- Contracts / Extraction — kontrak inspector, PDF/A, embedding, dan e-invoice.
- Core — kelas konkret yang memenuhi kontrak-kontrak ini.
- Event — padanan SPI peristiwa yang diterbitkan bersama
Contracts.