Przejdź do głównej zawartości

Dokumentacja API Symfony

Pakiet dla Symfony udostępnia rejestrację bundle’a, drzewo konfiguracji, wstrzykiwaną fabrykę dokumentów, pomocniki odpowiedzi Hypertext Transfer Protocol (HTTP) oraz typy Messengera do generowania asynchronicznego. W większości kodu aplikacji używane są tylko dwa symbole: usługa PdfFactory, którą wstrzykujesz, aby zbudować obiekt Document, oraz pomocnik PdfResponse, który zamienia ten dokument w bezpieczną odpowiedź HTTP. Pozostałe symbole (bundle, rozszerzenie, przebieg kompilatora, drzewo konfiguracji, obiekt transferu danych (DTO) Messengera oraz moduł obsługi) to elementy okablowania, które konfigurujesz raz albo pozostawiasz frameworkowi.

Zacznij tutaj: wstrzyknij NextPDF\Symfony\Service\PdfFactory, wywołaj create(), aby uzyskać nowy obiekt Document, i zwróć go za pomocą NextPDF\Symfony\Http\PdfResponse::download(). Pierwszy przykład pokazuje cały przepływ.

Skorzystaj z tych trzech gotowych do uruchomienia fragmentów kodu przy najczęstszych zadaniach. Każdy fragment korzysta wyłącznie ze zweryfikowanych symboli opisanych w poniższych tabelach.

Zwróć z kontrolera plik do pobrania w formacie Portable Document Format (PDF): wstrzyknij fabrykę, zbuduj dokument i przekaż go do pomocnika odpowiedzi:

<?php
declare(strict_types=1);
namespace App\Controller;
use NextPDF\Symfony\Http\PdfResponse;
use NextPDF\Symfony\Service\PdfFactory;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class InvoiceController
{
#[Route('/invoice/{number}', name: 'invoice_pdf')]
public function download(PdfFactory $pdf, string $number): Response
{
$doc = $pdf->create();
$doc->addPage();
$doc->setFont('dejavusans', '', 12);
$doc->cell(0, 10, "Invoice #{$number}");
return PdfResponse::download($doc, "invoice-{$number}.pdf");
}
}

Co robi: PdfFactory::create() zwraca nowy, wstępnie skonfigurowany obiekt Document. PdfResponse::download() wysyła go z nagłówkiem Content-Type: application/pdf, dyspozycją załącznika oraz stałymi nagłówkami zabezpieczeń bundle’a.

Przesyłaj duży plik PDF strumieniowo, aby ograniczyć szczytowe zużycie pamięci: użyj pomocnika strumieniowego i zwróć StreamedResponse:

<?php
declare(strict_types=1);
namespace App\Controller;
use NextPDF\Symfony\Http\PdfResponse;
use NextPDF\Symfony\Service\PdfFactory;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Attribute\Route;
final class ReportController
{
#[Route('/report', name: 'report_pdf')]
public function report(PdfFactory $pdf): StreamedResponse
{
$doc = $pdf->create();
$doc->addPage();
$doc->setFont('dejavusans', '', 12);
$doc->cell(0, 10, 'Annual report');
return PdfResponse::streamDownload($doc, 'annual-report.pdf');
}
}

Co robi: PdfResponse::streamDownload() emituje zmaterializowany plik PDF we fragmentach i pomija Content-Length; użyj streamInline() jako odpowiednika wyświetlanego w przeglądarce.

Aby wygenerować plik PDF asynchronicznie, wyślij GeneratePdfMessage do transportu Messengera, aby renderowanie odbyło się w procesie roboczym:

<?php
declare(strict_types=1);
namespace App\Controller;
use App\Pdf\InvoicePdfBuilder;
use NextPDF\Symfony\Message\GeneratePdfMessage;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Attribute\Route;
final class QueueController
{
#[Route('/invoice/{id}/queue', name: 'invoice_queue')]
public function queue(MessageBusInterface $bus, int $id): Response
{
$bus->dispatch(new GeneratePdfMessage(
builderClass: InvoicePdfBuilder::class,
outputPath: '/var/storage/invoices/' . $id . '.pdf',
builderContext: ['invoice_id' => $id],
));
return new Response('PDF generation queued.', 202);
}
}

Co robi: DTO przenosi class-string konstruktora oraz zwalidowaną ścieżkę wyjściową. Moduł obsługi rozwiązuje konstruktor, buduje dokument i zapisuje go w procesie roboczym. Klasa konstruktora implementuje PdfBuilderInterface i jest zarejestrowana w lokalizatorze usług (przewodnik szybkiego startu dla Symfony opisuje okablowanie lokalizatora i procesu roboczego).

Ta tabela opisuje dokładny konstruktor oraz kontrakt create() wstrzykiwanej usługi tworzącej nowe dokumenty.

SymbolParametryZachowanie domyślneZwracaZgłasza lub kończy się niepowodzeniem zUwagi
new PdfFactory(DocumentFactoryInterface $factory, array $defaults, ?string $pdfa, array $artisanConfig)factory: fabryka rdzenia; defaults: twórca, autor, język, marginesy; pdfa: opcjonalny profil PDF/A; artisanConfig: opcjonalna konfiguracja renderera Chrome.Wartości domyślne są stosowane tylko wtedy, gdy zostały skonfigurowane.PdfFactoryBłędy okablowania kontenera.Usługa może być singletonem, ponieważ create() zwraca nowy dokument.
PdfFactory::create()brak.Ustawia twórcę i język; ustawia autora tylko wtedy, gdy nie jest pusty; stosuje konfigurację PDF/A i Artisan tylko wtedy, gdy jest dostępna.NextPDF\Core\DocumentBłędy konfiguracji rdzenia.Wywołuj raz na żądanie, polecenie lub komunikat.
PdfFactory::setArtisanAvailable(bool $available)available: flaga dostępności w czasie kompilacji.Wyłączone, dopóki nie włączy go przebieg kompilatora.voidbrak oczekiwanych.Wewnętrzny hook wywoływany przez opcjonalny przebieg kompilatora rozszerzenia.
PdfFactory::setProAvailable(bool $available)available: flaga dostępności w czasie kompilacji.Wyłączone, dopóki nie włączy go przebieg kompilatora.voidbrak oczekiwanych.Wewnętrzny hook dostępności funkcji Premium.

Pierwsza tabela opisuje warstwę okablowania: rejestrację bundle’a, drzewo konfiguracji nextpdf oraz wykrywanie opcjonalnych rozszerzeń. Druga tabela zawiera listę kluczy konfiguracji.

SymbolParametryZachowanie domyślneZwracaZgłasza lub kończy się niepowodzeniem zUwagi
NextPdfBundle::build(ContainerBuilder $container)Konstruktor kontenera Symfony.Wywołuje nadrzędną metodę build i rejestruje OptionalExtensionPass.voidBłędy rejestracji przebiegu kompilatora.Włącza wykrywanie opcjonalnych funkcji Artisan i Premium.
NextPdfBundle::getPath()brak.Zwraca główną ścieżkę pakietu.stringbrak oczekiwanych.Używane przez wykrywanie bundle’i i ładowanie zasobów w Symfony.
NextPdfExtension::load(array $configs, ContainerBuilder $container)Tablice konfiguracji użytkownika i konstruktor kontenera.Przetwarza konfigurację nextpdf, przechowuje rozwiązane parametry, ładuje definicje usług i weryfikuje wymagane rozszerzenia.voidBłędy walidacji konfiguracji, ładowania usług lub braku wymaganego rozszerzenia.Wymaganymi rozszerzeniami są mbstring i zlib.
NextPdfExtension::getAlias()brak.Używa nextpdf jako głównego klucza konfiguracji.stringbrak oczekiwanych.Skonfiguruj bundle pod kluczem nextpdf:.
Configuration::getConfigTreeBuilder()brak.Definiuje walidowane drzewo konfiguracji nextpdf.TreeBuilderBłędy definicji konfiguracji w Symfony.Odzwierciedla strukturę konfiguracji Laravel tam, gdzie jest to praktyczne.
OptionalExtensionPass::process(ContainerBuilder $container)Konstruktor kontenera Symfony.Wykrywa opcjonalne usługi Artisan i Premium oraz przełącza flagi dostępności fabryki.voidBłędy okablowania przebiegu kompilatora.Uruchamia się podczas kompilacji kontenera.
Klucz konfiguracjiTypZachowanie domyślneUwagi
page_formatenumA4; dozwolone wartości obejmują A3, A5, Letter, Legal i Tabloid.Dotyczy domyślnego tworzenia dokumentu.
orientationenumP; dozwolone wartości to P i L.Używaj jawnych wywołań dokumentu, gdy strona wymaga innej orientacji.
unitenummm; dozwolone wartości to pt, mm, cm i in.Utrzymuje domyślne wartości frameworka w zgodzie z jednostkami rdzenia.
pdfa`stringnull`null; dozwolone wartości to 4, 4e i 4f.
fonts_path / cache_pathstringŚcieżka czcionek projektu i ścieżka pamięci podręcznej kernela.Zadbaj, aby każda ścieżka była odpowiednio odczytywalna albo zapisywalna w czasie wykonywania.
signature.*arrayDomyślnie wyłączone, z poziomem podpisu B-B.Udostępnia certyfikat, klucz, hasło, dodatkowe certyfikaty oraz poziom.
tsa.*arrayWyłączone, gdy adres Uniform Resource Locator (URL) ma wartość null; limit czasu domyślnie wynosi 30 sekund.Obsługuje poświadczenia, pliki wzajemnego uwierzytelniania Transport Layer Security (mTLS), przypięcia kluczy publicznych oraz politykę HTTP.
ocsp_cache.*arrayWłączone z czasem życia (TTL) wynoszącym 86400 sekund.Używane przez przepływy walidacji i długoterminowych podpisów, gdy jest dostępne.
messenger.*arrayTransport async, limit czasu 120, ponowne próby 3.Używane przez przepływy generowania asynchronicznego.
artisan.*arrayRenderer Chrome jest wyłączony, chyba że został skonfigurowany i zainstalowany.Mapuje się na ChromerendererConfig, gdy opcjonalny renderer jest dostępny.
defaults.*arrayTwórca NextPDF, autor pusty, język en, domyślne marginesy i czcionka.Stosowane przez PdfFactory::create().

Ta tabela pomaga wybrać pomocnika odpowiedzi według trybu wyświetlania i buforowania: wyświetlanie w przeglądarce lub pobieranie, buforowane albo strumieniowe. Pokazuje również zachowanie nazwy pliku i nagłówków.

SymbolParametryZachowanie domyślneZwracaZgłasza lub kończy się niepowodzeniem zUwagi
PdfResponse::inline(Document $document, string $filename = 'document.pdf')document: zbudowany dokument; filename: nazwa pliku odpowiedzi.Dodaje .pdf, gdy go brakuje.Symfony\Component\HttpFoundation\ResponseBłędy serializacji rdzenia.Ustawia typ zawartości PDF oraz nagłówki ochronne.
PdfResponse::download(Document $document, string $filename = 'document.pdf')Tak samo jak inline; dyspozycja to załącznik.Odpowiedź wymuszająca pobieranie w przeglądarce.ResponseTak samo jak inline.Używaj do jawnych pobrań.
PdfResponse::streamInline(Document $document, string $filename = 'document.pdf')Tak samo jak inline.Emituje bajty zmaterializowanego pliku PDF we fragmentach.StreamedResponseTak samo jak inline.Nie eliminuje materializacji dokumentu.
PdfResponse::streamDownload(Document $document, string $filename = 'document.pdf')Tak samo jak streamInline; dyspozycja to załącznik.Odpowiedź strumieniowa z pobieraniem.StreamedResponseTak samo jak streamInline.Zastosuj politykę rozmiaru wyjścia przed renderowaniem.

Ta tabela opisuje ścieżkę asynchroniczną: DTO wysyłanego komunikatu, interfejs konstruktora, który implementujesz, oraz moduł obsługi działający w procesie roboczym.

SymbolParametryZachowanie domyślneZwracaZgłasza lub kończy się niepowodzeniem zUwagi
new GeneratePdfMessage(string $builderClass, string $outputPath, array $builderContext = [])builderClass: class-string implementujący PdfBuilderInterface; outputPath: docelowy .pdf; builderContext: serializowalne dane.Pusta tablica kontekstu.DTO komunikatu.InvalidArgumentException dla nieprawidłowej w pełni kwalifikowanej nazwy klasy (FQCN), stream wrappera, bajtu null, przejścia po katalogach, pustej ścieżki lub celu innego niż .pdf.Transporty Messengera przenoszą dane, a nie domknięcia.
PdfBuilderInterface::build(Document $document, array $context): Documentdocument: nowy, skonfigurowany dokument; context: serializowalne dane komunikatu.Brak domyślnego kontekstu poza wartością komunikatu.Skonfigurowany Document.Wyjątki specyficzne dla konstruktora.Zadbaj, aby konstruktory były deterministyczne i idempotentne.
new GeneratePdfHandler(PdfFactory $pdfFactory, ContainerInterface $builderLocator)Fabryka PDF oraz otagowany lokalizator usług konstruktorów.Podczas konstrukcji nie jest tworzony żaden dokument.GeneratePdfHandlerBłędy okablowania kontenera.Lokalizator powinien udostępniać wyłącznie implementacje PdfBuilderInterface.
GeneratePdfHandler::__invoke(GeneratePdfMessage $message)message: zwalidowane DTO komunikatu.Rozwiązuje konstruktor z kontenera, buduje dokument i zapisuje go.voidBrakująca usługa konstruktora, nieprawidłowy wynik konstruktora, błędy zapisu rdzenia.Preferuj konstruktory usługowe zamiast statycznych wywołań zwrotnych.
  • Nie przechowuj obiektu Document jako usługi. Przechowuj PdfFactory i wywołuj create() dla każdej jednostki pracy.
  • Kolejkuj wyłącznie serializowalny kontekst. Nie umieszczaj otwartych strumieni, domknięć ani obiektów żądania w builderContext.
  • Stosuj politykę ścieżki wyjściowej bardziej restrykcyjną niż DTO, jeśli wdrożenie ma katalogi główne pamięci masowej właściwe dla najemcy.