Lewati ke konten

Render manifest: permintaan render portabel

Render manifest adalah deskripsi portabel tentang apa yang harus dirender: input, templat, fon, locale, profil konformansi, kebijakan tanda tangan, target keluaran, dan flag Fast-Web-View. Setiap transport membangun dan mengirimkan RenderManifest yang sama, baik berupa command-line interface (CLI), integrasi framework, application programming interface (API) software-as-a-service (SaaS), maupun konektor stream di masa depan. Kontrak ini deterministik: dua manifest yang sama akan diserialisasi menjadi JavaScript Object Notation (JSON) yang identik per bita, dan setiap manifest membawa kunci idempotensi turunan sehingga sistem hilir dapat mengenali dan menghapus duplikasi render yang sama.

Manifest adalah kontrak Core. Manifest mendefinisikan skema; engine dan stream processor premium menjalankan permintaan.

Terminal window
composer require nextpdf/core:^3

Gunakan builder sebagai jalur konstruksi yang stabil, atau gunakan RenderManifest::fromArray() untuk manifest yang telah dideserialisasi. Konstruktor langsungnya bersifat @internal: bidang opsional baru ditambahkan dengan nilai standar, sehingga builder dan fromArray() dapat mengakomodasinya tanpa merusak titik panggilan Anda.

examples/manifest/build.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Manifest\OutputObjectKey;
use NextPDF\Manifest\RenderManifestBuilder;
use NextPDF\Manifest\TemplateRef;
$manifest = RenderManifestBuilder::create('invoice-2026-0001')
->withInlineInput('<h1>Invoice 2026-0001</h1>')
->withTemplate(TemplateRef::html())
->withOutputKey(OutputObjectKey::file('invoices', '2026-0001.pdf'))
->withLocale('en-US')
->linearized()
->build();
// Deterministic, canonical-key-order JSON — equal manifests are byte-identical.
$json = $manifest->toJson();
BidangArti
jobIdPengidentifikasi logis yang stabil bagi pemanggil, disertakan kembali dalam peristiwa dan resi. Dikecualikan dari kunci idempotensi.
idempotencyKeyKunci deduplikasi yang deterministik (lihat di bawah).
inputSumber data render: payload inline, Uniform Resource Identifier (URI), atau referensi dataset disertai hash konten.
templateRenderer front end dan pengidentifikasi templat opsional.
fontsKumpulan fon yang dideklarasikan (standarnya kosong).
localeTag bahasa BCP-47 (standarnya en-US).
conformanceProfilePengidentifikasi profil yang stabil (standarnya none).
signaturePolicyPengidentifikasi kebijakan yang stabil (standarnya none).
targetKunci objek keluaran, format, dan kebijakan penimpaan (clobber).
linearizeFlag Fast-Web-View; digunakan bersama linearisasi.
metadataPeta key/value skalar yang bersifat buram dan disertakan kembali dalam peristiwa (event).

IdempotencyKey::derive() hanya menghitung hash atas subset manifest yang menentukan render: templat, hash konten input, fon, locale, konformansi, kebijakan tanda tangan, flag linearize, dan kunci target. Dengan sengaja, kunci ini mengecualikan jobId dan metadata, sehingga dua permintaan dengan input penentu render yang identik, termasuk target keluaran, berbagi kunci yang sama dan dapat dideduplikasi meskipun pengidentifikasi pekerjaan atau metadata pelacakannya berbeda. Pemanggil juga dapat menyediakan kunci eksplisit; isDerived() menunjukkan jalur mana yang menghasilkannya.

RenderManifest::SCHEMA_VERSION menetapkan versi skema (saat ini 1.0). Dalam satu versi mayor, evolusi hanya bersifat aditif: pembaca menoleransi kunci tak dikenal dari skema minor yang lebih baru, tetapi menolak versi mayor yang lebih baru. SchemaCompatibility::assertReadable() menegakkan hal ini di fromArray(), dan canRead() / isForwardRead() memungkinkan Anda menguji kompatibilitas tanpa melempar pengecualian.

Karena manifest adalah data transfer object (DTO) readonly yang konstruktornya bersifat @internal, bangunlah melalui builder atau fromArray(). Bidang baru ditambahkan sebagai parameter konstruktor dengan nilai standar, sehingga penambahan bidang tidak merusak titik panggilan yang ada.

RenderManifestValidator::validate() tidak melempar pengecualian dan mengumpulkan semua masalah: ia mengembalikan setiap masalah yang ditemukannya alih-alih gagal pada masalah pertama. Ia menolak kunci keluaran yang tidak aman (traversal, jalur absolut, stream wrapper), lebih dari satu sumber input, pengidentifikasi profil konformansi yang tak dikenal, locale BCP-47 yang tidak valid, dan ketidakcocokan kebijakan penimpaan (clobber). warnings() mengembalikan catatan anjuran yang tidak memblokir.

use NextPDF\Manifest\RenderManifestValidator;
$problems = (new RenderManifestValidator())->validate($manifest);
if ($problems !== []) {
// Each entry is a stable, human-readable problem string.
}

SingleDocumentRenderer mengubah satu manifest menjadi satu Portable Document Format (PDF) secara deterministik. Sifatnya murni: ia mengembalikan bita beserta digest sha-256-nya dan tidak menulis berkas apa pun, sehingga staging dan commit exactly-once tetap menjadi tanggung jawab pemanggil (atau stream processor).

use NextPDF\Manifest\Render\SingleDocumentRenderer;
use NextPDF\Manifest\Render\StandaloneDocumentFactory;
$renderer = new SingleDocumentRenderer(new StandaloneDocumentFactory());
$outcome = $renderer->render($manifest);
$bytes = $outcome->bytes;
$digest = $outcome->sha256;
$pages = $outcome->pageCount;
TipeJenisAnggota utamaStabilitasSejak
RenderManifestDTO readonlytoArray(), toJson(), fromArray(), canonicalDigestInput(), SCHEMA_VERSIONstabil3.2.0
RenderManifestBuilderbuildercreate(), with*(), linearized(), build()stabil3.2.0
IdempotencyKeyvalue objectof(), derive(), equals(), isDerived()stabil3.2.0
SchemaCompatibilityhelpercanRead(), isForwardRead(), assertReadable()stabil3.2.0
RenderManifestValidatorservicevalidate(), warnings()stabil3.2.0
SingleDocumentRendererservicerender(): RenderOutcomestabil3.2.0

fromArray() melempar RenderManifestException ketika bidang wajib tidak ada atau versi skemanya tidak dapat dibaca.