Lewati ke konten

Panduan pengembang Symfony

Bundle Symfony berpusat pada layanan. Injeksikan PdfFactory, panggil create() untuk setiap dokumen Portable Document Format (PDF), dan gunakan builder Messenger untuk pembuatan asinkron. Anda dapat mempertahankan factory sebagai layanan kontainer karena setiap panggilan mengembalikan dokumen baru.

Gunakan panduan ini saat Anda merancang controller, layanan, handler Messenger, atau titik perluasan pada tingkat bundle untuk nextpdf/symfony.

LapisanDimiliki olehTanggung jawabJangan letakkan di sini
ControllerAplikasiMengotorisasi permintaan, mengumpulkan input, dan mengembalikan PdfResponse.Tata letak PDF yang dibagikan antarkasus penggunaan.
Layanan aplikasiAplikasiMemuat data domain dan memilih builder.Logika compiler kontainer Symfony.
Layanan builderAplikasiMengimplementasikan PdfBuilderInterface untuk konstruksi dokumen secara sinkron atau melalui antrean.Objek permintaan, entity manager, atau konteks yang tidak dapat diserialkan.
Bundle Symfonynextpdf/symfonyMendaftarkan layanan, pohon konfigurasi, pass perluasan opsional, helper respons, dan objek transfer data (DTO) Messenger.Kebijakan penyimpanan khusus tenant.
Mesin intinextpdf/nextpdfMembuat dan menserialisasi dokumen.Perilaku respons Symfony atau Messenger.
TahapPerilakuTindakan pengembang
Boot bundleNextPdfBundle::build() mendaftarkan deteksi perluasan opsional.Biarkan Symfony menemukan bundle atau daftarkan di bundles.php.
Pemuatan konfigurasiNextPdfExtension::load() memproses konfigurasi nextpdf: dan memuat definisi layanan.Jaga konfigurasi tetap eksplisit dan peka terhadap environment.
Penggunaan factoryPdfFactory::create() mengembalikan dokumen baru yang telah dikonfigurasi.Jangan menyimpan dokumen di dalam layanan.
Keluaran controllerPdfResponse mengubah dokumen yang sudah selesai menjadi respons.Gunakan helper alih-alih menyusun header secara manual.
Pengiriman MessengerGeneratePdfMessage membawa kelas builder, jalur keluaran, dan konteks yang dapat diserialkan.Jaga konteks tetap minimal dan mudah ditangani sebagai nilai skalar.
Penanganan pesanGeneratePdfHandler menyelesaikan builder dari service locator dan menyimpan dokumen.Buat builder bersifat deterministik dan idempoten.
JalurTujuan
src/Pdf/Builder/*Layanan yang mengimplementasikan PdfBuilderInterface.
src/Pdf/Data/*DTO kecil atau array yang digunakan sebagai konteks builder.
src/Pdf/Storage/*Pemilihan akar penyimpanan dan kebijakan nama berkas keluaran.
src/Controller/*Titik masuk respons sinkron.
tests/Pdf/*Uji builder, respons, Messenger, dan konfigurasi.

Prioritaskan layanan builder daripada fungsi helper statis. Layanan ini mudah ditandai, didekorasi, diuji, dan digunakan dari Messenger.

<?php
namespace App\Pdf\Builder;
use NextPDF\Core\Document;
use NextPDF\Symfony\Message\PdfBuilderInterface;
final readonly class InvoicePdfBuilder implements PdfBuilderInterface
{
public function build(Document $document, array $context): Document
{
$document->setTitle((string) $context['title'])
->addPage()
->writeHtml((string) $context['html']);
return $document;
}
}
<?php
namespace App\Controller;
use App\Pdf\Builder\InvoicePdfBuilder;
use NextPDF\Symfony\Http\PdfResponse;
use NextPDF\Symfony\Service\PdfFactory;
final readonly class InvoiceController
{
public function __invoke(
PdfFactory $factory,
InvoicePdfBuilder $builder,
) {
$document = $builder->build($factory->create(), [
'title' => 'Invoice 1234',
'html' => '<h1>Invoice 1234</h1>',
]);
return PdfResponse::download($document, 'invoice-1234.pdf');
}
}

Jaga konteks controller tetap kecil. Saat builder membutuhkan banyak objek domain, pindahkan orkestrasi ke dalam layanan aplikasi dan teruskan DTO atau array ternormalisasi ke builder.

GeneratePdfMessage memvalidasi kelas builder dan jalur keluaran sebelum pengiriman. Handler memvalidasi kembali jalur tersebut saat dijalankan.

<?php
use App\Pdf\Builder\InvoicePdfBuilder;
use NextPDF\Symfony\Message\GeneratePdfMessage;
$bus->dispatch(new GeneratePdfMessage(
builderClass: InvoicePdfBuilder::class,
outputPath: $projectDir . '/var/pdfs/invoice-1234.pdf',
builderContext: [
'title' => 'Invoice 1234',
'html' => '<h1>Invoice 1234</h1>',
],
));

Jangan memasukkan entitas Doctrine, stream terbuka, closure, objek permintaan, atau objek layanan ke dalam builderContext.

Titik perluasanGunakan untukBatasan
Dekorasi layanan PdfFactoryMenerapkan nilai standar aplikasi sebelum dokumen mencapai controller.Harus mempertahankan semantik pembuatan dokumen baru.
PdfBuilderInterfaceMendefinisikan builder dokumen yang diantrekan atau dapat dipakai ulang.Harus mengembalikan sebuah Document.
OptionalExtensionPassMengaktifkan fitur Artisan atau Premium opsional pada waktu kompilasi.Ketersediaan ditentukan oleh status saat kompilasi kontainer, bukan status saat permintaan.
Pohon konfigurasi SymfonyNilai standar, PDF/A, pengaturan renderer, tanda tangan, otoritas penandaan waktu (TSA), dan Messenger.Konfigurasi yang tidak valid sebaiknya gagal saat kontainer dibangun.
Pengabelan layanan GeneratePdfHandlerMembatasi builder yang dapat dijangkau dari pesan yang diantrekan.Service locator sebaiknya hanya mengekspos layanan builder yang disetujui.
  1. Tambahkan layanan builder dengan input yang deterministik.
  2. Gunakan PdfFactory::create() di controller atau layanan.
  3. Tambahkan uji respons untuk nama berkas, jenis konten, dan header.
  4. Daftarkan builder ke Messenger saat dokumen yang sama harus dihasilkan secara asinkron.
  5. Tambahkan uji untuk pesan tidak valid pada nama kelas, jalur keluaran, dan bentuk konteks.
  6. Tambahkan uji kompilasi kontainer dengan konfigurasi minimal dan produksi.
  7. Ukur waktu render dan memori dengan pengaturan PHP yang sama dengan produksi.
KegagalanTempat penanganan yang semestinyaRespons yang direkomendasikan
Konfigurasi tidak validKompilasi kontainer.Gagalkan deployment sebelum lalu lintas mencapai aplikasi.
Layanan builder tidak adaUji handler Messenger serta tag layanan.Gagalkan pesan dan beri tahu tim pemilik.
Jalur keluaran tidak amanKonstruktor pesan dan kebijakan penyimpanan.Tolak sebelum pengiriman; pertahankan validasi handler sebagai pertahanan berlapis.
Perluasan opsional tidak tersediaCompiler pass dan perilaku factory.Nonaktifkan fitur opsional atau jadikan pemasangan eksplisit.
Kegagalan konversi layanan atau renderingBatas builder.Gagal tertutup kecuali kasus penggunaan memiliki fallback yang terdokumentasi.
PerhatianStandarKapan harus menimpa
Masa hidup factoryLayanan kontainer.Pertahankan ini; factory aman karena ia membuat dokumen baru.
Masa hidup dokumenSatu unit kerja.Jangan pernah membagikannya antarpermintaan atau antarpesan.
Validasi jalur keluaranKonstruktor pesan dan handler.Tambahkan batasan tenant atau akar penyimpanan di dalam kode aplikasi.
Nama berkas responsdocument.pdf.Ganti dengan pengidentifikasi bisnis yang telah disanitasi.
Transport Messengerasync.Gunakan transport khusus ketika pekerjaan PDF berat.
  • Uji kontainer memastikan bundle dikompilasi dengan konfigurasi minimal dan produksi.
  • Uji respons memastikan header keamanan dan penanganan nama berkas.
  • Uji Messenger memastikan bahwa jalur tidak valid dan nama kelas builder tidak valid gagal sebelum pengiriman.
  • Uji handler menggunakan layanan builder sungguhan dan direktori keluaran sementara.
  • Uji builder merender dokumen yang representatif dan menyimpannya dengan izin sistem berkas seperti produksi.
  • Uji perluasan opsional mencakup kondisi Artisan tidak tersedia, Premium tidak tersedia, dan perilaku profil PDF/A yang dikonfigurasi.