Przejdź do głównej zawartości

Manifest renderowania: przenośne żądanie renderowania

Manifest renderowania to przenośny opis tego, co należy wyrenderować: danych wejściowych, szablonu, czcionek, ustawień regionalnych, profilu zgodności, zasad podpisu, celu wyjściowego oraz flagi Fast-Web-View. Każdy transport buduje i przesyła ten sam obiekt RenderManifest, niezależnie od tego, czy jest to interfejs wiersza poleceń (CLI), integracja z frameworkiem, interfejs programowania aplikacji (API) w modelu oprogramowania jako usługi (SaaS), czy przyszły łącznik strumieniowy. Kontrakt jest deterministyczny: dwa identyczne manifesty serializują się do identycznej bajt po bajcie notacji obiektowej JavaScript (JSON), a każdy manifest zawiera wyprowadzony klucz idempotentności, dzięki czemu systemy zależne mogą rozpoznać i zdeduplikować to samo renderowanie.

Manifest jest kontraktem modułu Core. Definiuje schemat; samo żądanie wykonują silnik oraz procesor strumieniowy Premium.

Okno terminala
composer require nextpdf/core:^3

Skorzystaj z buildera jako stabilnej ścieżki tworzenia albo z metody RenderManifest::fromArray() dla zdeserializowanego manifestu. Bezpośredni konstruktor jest oznaczony jako @internal: nowe pola opcjonalne są dodawane z wartościami domyślnymi, więc builder oraz metoda fromArray() obsługują je bez naruszania miejsc wywołań w kodzie.

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();
PoleZnaczenie
jobIdStabilny identyfikator logiczny nadawany przez wywołującego, powielany w zdarzeniach i potwierdzeniach. Wykluczony z klucza idempotentności.
idempotencyKeyDeterministyczny klucz deduplikacji (zobacz poniżej).
inputŹródło danych do renderowania: osadzony ładunek, ujednolicony identyfikator zasobu (URI) albo odwołanie do zbioru danych wraz ze skrótem treści.
templateInterfejs renderowania oraz opcjonalny identyfikator szablonu.
fontsDeklarowany zestaw czcionek (domyślnie pusty).
localeZnacznik języka BCP-47 (domyślnie en-US).
conformanceProfileStabilny identyfikator profilu (domyślnie none).
signaturePolicyStabilny identyfikator zasad (domyślnie none).
targetKlucz obiektu wyjściowego, format oraz zasady nadpisywania.
linearizeFlaga Fast-Web-View; współdziała z linearyzacją.
metadataNieinterpretowana mapa skalarnych par key/value powielana w zdarzeniach.

Metoda IdempotencyKey::derive() haszuje wyłącznie podzbiór manifestu określający renderowanie: szablon, skrót treści wejściowej, czcionki, ustawienia regionalne, zgodność, zasady podpisu, flagę linearyzacji oraz klucz celu. Celowo pomija pola jobId i metadata, dzięki czemu dwa żądania o identycznych danych określających renderowanie, wraz z celem wyjściowym, używają tego samego klucza i mogą zostać zdeduplikowane, nawet gdy różnią się identyfikatorami zadań lub metadanymi śledzenia. Wywołujący może również dostarczyć jawny klucz; metoda isDerived() wskazuje, która ścieżka go wytworzyła.

Stała RenderManifest::SCHEMA_VERSION ustala wersję schematu (obecnie 1.0). W ramach wersji głównej ewolucja jest wyłącznie addytywna: czytnik toleruje nieznane klucze z nowszej wersji pomocniczej schematu, ale odrzuca nowszą wersję główną. Metoda SchemaCompatibility::assertReadable() wymusza tę regułę w fromArray(), a metody canRead() / isForwardRead() pozwalają sprawdzić zgodność bez zgłaszania wyjątku.

Manifest jest obiektem transferu danych (DTO) typu readonly, a jego konstruktor jest oznaczony jako @internal, dlatego twórz go za pomocą buildera lub metody fromArray(). Nowe pola są dodawane jako parametry konstruktora z wartościami domyślnymi, więc dodanie pola nie narusza tych miejsc wywołań.

Metoda RenderManifestValidator::validate() nie zgłasza wyjątków i zbiera wszystkie problemy: zwraca każdy wykryty problem, zamiast przerywać przy pierwszym. Odrzuca niebezpieczne klucze wyjściowe (przechodzenie po katalogach, ścieżki bezwzględne, opakowania strumieni), więcej niż jedno źródło wejściowe, nieznany identyfikator profilu zgodności, nieprawidłowe ustawienia regionalne BCP-47 oraz niezgodność zasad nadpisywania. Metoda warnings() zwraca nieblokujące uwagi doradcze.

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

Klasa SingleDocumentRenderer deterministycznie przekształca jeden manifest w jeden plik w formacie Portable Document Format (PDF). Działa bez efektów ubocznych: zwraca bajty wraz z ich skrótem sha-256 i nie zapisuje żadnego pliku, więc tymczasowe przechowywanie i zatwierdzanie w modelu exactly-once pozostają w gestii wywołującego (lub procesora strumieniowego).

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;
TypRodzajKluczowe składoweStabilnośćOd wersji
RenderManifestDTO typu readonlytoArray(), toJson(), fromArray(), canonicalDigestInput(), SCHEMA_VERSIONstabilny3.2.0
RenderManifestBuilderbuildercreate(), with*(), linearized(), build()stabilny3.2.0
IdempotencyKeyobiekt wartościof(), derive(), equals(), isDerived()stabilny3.2.0
SchemaCompatibilityklasa pomocniczacanRead(), isForwardRead(), assertReadable()stabilny3.2.0
RenderManifestValidatorusługavalidate(), warnings()stabilny3.2.0
SingleDocumentRendererusługarender(): RenderOutcomestabilny3.2.0

Metoda fromArray() zgłasza wyjątek RenderManifestException, gdy brakuje wymaganego pola albo wersji schematu nie można odczytać.