Перейти к содержимому

Справочник по Symfony API

Пакет Symfony предоставляет регистрацию бандла, дерево конфигурации, внедряемую фабрику для создания новых документов, помощники для HTTP-ответов и типы Messenger для асинхронной генерации. Большая часть кода приложения использует только два символа: сервис PdfFactory, который вы внедряете для создания Document, и помощник PdfResponse, который превращает этот документ в защищённый HTTP-ответ. Остальные символы (бандл, расширение, проход компилятора, дерево конфигурации, Messenger DTO и обработчик) — это связующий слой, который вы настраиваете один раз или которым за вас управляет фреймворк.

С чего начать: внедрите NextPDF\Symfony\Service\PdfFactory, вызовите create(), чтобы получить новый Document, и верните его с помощью NextPDF\Symfony\Http\PdfResponse::download(). Первый пример показывает этот процесс.

Используйте эти три готовых к запуску фрагмента кода для самых типовых задач. Каждый фрагмент использует только проверенные символы, описанные в таблицах ниже.

Вернуть PDF-файл для загрузки из контроллера: внедрите фабрику, создайте документ и передайте его помощнику ответов:

<?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");
}
}

Что это делает: PdfFactory::create() возвращает новый, предварительно настроенный Document. PdfResponse::download() отправляет его с Content-Type: application/pdf, как вложение и с фиксированными заголовками безопасности бандла.

Потоковая передача большого PDF, чтобы снизить пиковое потребление памяти: используйте помощник потоковой передачи и верните 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');
}
}

Что это делает: PdfResponse::streamDownload() выдаёт материализованный PDF по частям и не указывает Content-Length; для встроенного эквивалента используйте streamInline().

Запустить асинхронную генерацию PDF: отправьте GeneratePdfMessage в транспорт Messenger, чтобы отрисовка выполнялась на воркере:

<?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);
}
}

Что это делает: DTO содержит строку класса построителя и проверенный путь вывода. Обработчик разрешает построитель, создаёт документ и сохраняет его на воркере. Класс построителя реализует PdfBuilderInterface и регистрируется в локаторе сервисов (настройку локатора и воркера см. в кратком руководстве по Symfony).

Используйте эту таблицу для точного описания конструктора и контракта create() для внедряемого сервиса, который создаёт новые документы.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new PdfFactory(DocumentFactoryInterface $factory, array $defaults, ?string $pdfa, array $artisanConfig)factory: основная фабрика; defaults: создатель, автор, язык, поля; pdfa: необязательный профиль PDF/A; artisanConfig: необязательная конфигурация рендерера Chrome.Значения по умолчанию применяются только при наличии конфигурации.PdfFactoryОшибки конфигурации контейнера.Сервис может быть синглтоном, поскольку create() возвращает новый документ.
PdfFactory::create()нет.Применяет создателя и язык; применяет автора только при непустом значении; применяет PDF/A и конфигурацию Artisan только при их наличии.NextPDF\Core\DocumentОшибки конфигурации ядра.Используйте один раз на запрос, команду или сообщение.
PdfFactory::setArtisanAvailable(bool $available)available: флаг доступности на этапе компиляции.Отключено, пока проход компилятора не включит этот флаг.voidне ожидается.Внутренний хук, который вызывает проход компилятора необязательного расширения.
PdfFactory::setProAvailable(bool $available)available: флаг доступности на этапе компиляции.Отключено, пока проход компилятора не включит этот флаг.voidне ожидается.Внутренний хук для доступности Premium.

Используйте первую таблицу для связующего слоя: регистрация бандла, дерево конфигурации nextpdf и обнаружение необязательных расширений. Вторая таблица перечисляет ключи конфигурации.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
NextPdfBundle::build(ContainerBuilder $container)Построитель контейнера Symfony.Вызывает родительский метод build и регистрирует OptionalExtensionPass.voidОшибки регистрации прохода компилятора.Включает обнаружение необязательных возможностей Artisan и Premium.
NextPdfBundle::getPath()нет.Возвращает корневой путь пакета.stringне ожидается.Используется механизмом обнаружения бандлов Symfony и загрузкой ресурсов.
NextPdfExtension::load(array $configs, ContainerBuilder $container)Массивы пользовательской конфигурации и построитель контейнера.Обрабатывает конфигурацию nextpdf, сохраняет разрешённые параметры, загружает определения сервисов и проверяет обязательные расширения.voidОшибки проверки конфигурации, загрузки сервисов или отсутствующего расширения.Обязательные расширения — mbstring и zlib.
NextPdfExtension::getAlias()нет.Использует nextpdf в качестве корневого ключа конфигурации.stringне ожидается.Настройте бандл под nextpdf:.
Configuration::getConfigTreeBuilder()нет.Определяет проверенное дерево конфигурации nextpdf.TreeBuilderОшибки определения конфигурации Symfony.По возможности повторяет форму конфигурации Laravel.
OptionalExtensionPass::process(ContainerBuilder $container)Построитель контейнера Symfony.Обнаруживает необязательные сервисы Artisan и Premium и устанавливает флаги доступности фабрики.voidОшибки настройки прохода компилятора.Выполняется во время компиляции контейнера.
Ключ конфигурацииТипПоведение по умолчаниюПримечания
page_formatenumA4; допустимые значения включают A3, A5, Letter, Legal и Tabloid.Применяется при создании документа по умолчанию.
orientationenumP; допустимые значения — P и L.Используйте явные вызовы документа, когда странице нужна другая ориентация.
unitenummm; допустимые значения — pt, mm, cm и in.Согласует значения по умолчанию фреймворка с единицами ядра.
pdfa`stringnull`null; допустимые значения — 4, 4e и 4f.
fonts_path / cache_pathstringПуть к шрифтам проекта и путь к кешу ядра.Сохраняйте каждый путь доступным для чтения или записи в соответствии с его ролью во время выполнения.
signature.*arrayОтключено по умолчанию с уровнем подписи B-B.Предоставляет сертификат, ключ, пароль, дополнительные сертификаты и уровень.
tsa.*arrayОтключено, когда URL равен null; тайм-аут по умолчанию составляет 30 секунд.Поддерживает учётные данные, файлы взаимной TLS-аутентификации (mTLS), закрепление открытых ключей и политику HTTP.
ocsp_cache.*arrayВключено со временем жизни (TTL) 86400 секунд.Используется при проверке и в процессах долгосрочных подписей, когда это доступно.
messenger.*arrayТранспорт async, тайм-аут 120, 3 повтора.Используется процессами асинхронной генерации.
artisan.*arrayРендерер Chrome отключён, пока он не настроен и не установлен.Сопоставляется с ChromeRendererConfig, когда необязательный рендерер доступен.
defaults.*arrayСоздатель NextPDF, автор пустой, язык en, поля и шрифт по умолчанию.Применяется через PdfFactory::create().

Используйте эту таблицу, чтобы выбрать помощник ответов по режиму отображения и буферизации: встроенный просмотр или загрузка, буферизация или потоковая передача. Она также показывает поведение имени файла и заголовков.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
PdfResponse::inline(Document $document, string $filename = 'document.pdf')document: готовый документ; filename: имя файла ответа.Добавляет .pdf, если оно отсутствует.Symfony\Component\HttpFoundation\ResponseОшибки сериализации ядра.Устанавливает тип содержимого PDF и защитные заголовки.
PdfResponse::download(Document $document, string $filename = 'document.pdf')Так же, как inline; режим — вложение.Ответ, который браузер скачивает.ResponseТак же, как inline.Используйте для явных загрузок.
PdfResponse::streamInline(Document $document, string $filename = 'document.pdf')Так же, как inline.Выдаёт байты материализованного PDF по частям.StreamedResponseТак же, как inline.Не избавляет от материализации документа.
PdfResponse::streamDownload(Document $document, string $filename = 'document.pdf')Так же, как streamInline; режим — вложение.Ответ потоковой загрузки.StreamedResponseТак же, как streamInline.Примените политику размера вывода перед отрисовкой.

Используйте эту таблицу для асинхронного сценария: DTO сообщения, которое вы отправляете, интерфейс построителя, который вы реализуете, и обработчик, который выполняется на воркере.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new GeneratePdfMessage(string $builderClass, string $outputPath, array $builderContext = [])builderClass: строка класса, реализующая PdfBuilderInterface; outputPath: целевой файл .pdf; builderContext: сериализуемые данные.Пустой массив контекста.DTO сообщения.InvalidArgumentException при недопустимом полностью квалифицированном имени класса (FQCN), обёртке потока, нулевом байте, обходе каталогов, пустом пути или цели, не являющейся .pdf.Транспорты Messenger передают данные, а не замыкания.
PdfBuilderInterface::build(Document $document, array $context): Documentdocument: новый настроенный документ; context: сериализуемые данные сообщения.Контекста по умолчанию нет, кроме значения сообщения.Настроенный Document.Исключения, специфичные для построителя.Делайте построители детерминированными и идемпотентными.
new GeneratePdfHandler(PdfFactory $pdfFactory, ContainerInterface $builderLocator)Фабрика PDF и помеченный локатор сервисов построителей.Во время конструирования документ не создаётся.GeneratePdfHandlerОшибки конфигурации контейнера.Локатор должен предоставлять только реализации PdfBuilderInterface.
GeneratePdfHandler::__invoke(GeneratePdfMessage $message)message: проверенный DTO сообщения.Разрешает построитель из контейнера, создаёт документ и сохраняет его.voidОтсутствующий сервис построителя, недопустимый результат построителя, ошибки записи ядра.Предпочитайте построители-сервисы статическим обратным вызовам.
  • Не храните Document как сервис. Храните PdfFactory и вызывайте create() для каждой рабочей операции.
  • В очередь помещайте только сериализуемый контекст. Не помещайте открытые потоки, замыкания или объекты запроса в builderContext.
  • Используйте политику пути вывода строже, чем DTO, если в развёртывании у арендаторов отдельные корни хранилища.