Lewati ke konten

Panduan pengembang Laravel

Paket Laravel menyelaraskan NextPDF dengan konvensi Laravel tanpa mengubah siklus hidup dokumen inti. Container memiliki registry dan factory bersama. Setiap dokumen PDF bersifat sekali pakai, sehingga Anda sebaiknya hanya membangun, mengembalikan, mengalirkan, atau menyimpannya satu kali.

Gunakan panduan ini saat merancang service aplikasi, queue job, alur respons, atau cakupan pengujian untuk nextpdf/laravel.

LapisanDimiliki olehTanggung jawabJangan tempatkan di sini
ControllerAplikasiMengotorisasi permintaan, memilih document builder, dan mengembalikan respons.Aturan tata letak PDF bersama yang digunakan di berbagai kasus penggunaan.
Service aplikasiAplikasiMengumpulkan data domain dan memanggil kode document builder.Logika boot container atau konfigurasi paket.
Document builderAplikasiMenerjemahkan data domain menjadi panggilan ke dokumen NextPDF.Objek request, logika query Eloquent, atau detail transport queue.
Integrasi Laravelnextpdf/laravelMengikat factory, registry, signer, klien TSA, facade, respons, dan queue job.Jalur penyimpanan khusus bisnis atau kebijakan tenant.
Engine intinextpdf/nextpdfMembangun dan menserialisasi PDF.Kebijakan respons, queue, atau filesystem Laravel.
TahapPerilakuTindakan pengembang
Registrasi service providerNextPdfServiceProvider::register() mendaftarkan registry bersama, document factory, document binding, klien HTTP, klien time-stamping authority (TSA), signer, dan kontrak e-invoice opsional.Publikasikan dan tinjau config/nextpdf.php sebelum produksi.
Resolusi dokumenFacade Pdf dan binding PdfDocumentInterface meresolusi dokumen baru melalui DocumentFactoryInterface.Resolusikan dokumen sekali saja per permintaan, perintah, atau queue job.
PenyusunanKode aplikasi memanggil API dokumen inti melalui facade atau dokumen yang di-inject.Jaga agar ekstraksi data domain tetap berada di luar document builder.
Keluaran akhirPdfResponse menghasilkan keluaran HTTP, atau dokumen disimpan ke disk.Pilih satu jalur keluaran akhir per dokumen.
Eksekusi queueGeneratePdfJob membangun ulang dokumen di dalam worker dan memvalidasi jalur keluaran sekali lagi.Berikan konteks skalar dan jaga agar callback tetap idempoten.
JalurTujuan
app/Pdf/Builders/*Document builder murni yang menerima data dan mengembalikan dokumen yang sudah selesai.
app/Pdf/Data/*Data transfer object (DTO) ringkas yang membawa input dokumen yang sudah diotorisasi.
app/Services/*Orkestrasi aplikasi, query, delegasi otorisasi, dan pemilihan jalur penyimpanan.
app/Jobs/*Wrapper opsional di sekitar GeneratePdfJob saat aplikasi memerlukan job bernama.
tests/Feature/Pdf/*Pengujian respons HTTP, dispatch queue, dan otorisasi.
tests/Unit/Pdf/*Pengujian builder dengan input kecil yang deterministik.

Pastikan builder tetap independen dari objek request Laravel. Anda sebaiknya dapat memanggil builder dari controller, perintah, pengujian, atau queue worker dengan input yang sama.

<?php
namespace App\Pdf\Builders;
use App\Pdf\Data\InvoicePdfData;
use NextPDF\Contracts\PdfDocumentInterface;
final readonly class InvoicePdfBuilder
{
public function build(PdfDocumentInterface $pdf, InvoicePdfData $data): PdfDocumentInterface
{
$pdf->setTitle($data->title)
->addPage()
->setFont('dejavusans', '', 12)
->writeHtml($data->html);
return $pdf;
}
}

Gunakan constructor injection saat alur PDF menjadi bagian dari logika aplikasi. Gunakan facade hanya untuk alur controller yang ringkas, ketika gaya statisnya lebih mudah dibaca.

<?php
namespace App\Http\Controllers;
use App\Pdf\Builders\InvoicePdfBuilder;
use App\Pdf\Data\InvoicePdfData;
use NextPDF\Contracts\PdfDocumentInterface;
use NextPDF\Laravel\Http\PdfResponse;
final readonly class DownloadInvoiceController
{
public function __invoke(
PdfDocumentInterface $pdf,
InvoicePdfBuilder $builder,
) {
$document = $builder->build(
$pdf,
InvoicePdfData::fromInvoiceId(1234),
);
return PdfResponse::download($document, 'invoice-1234.pdf');
}
}

Helper respons mematerialisasi byte dokumen sebelum membangun respons Laravel. Helper tersebut adalah helper respons, bukan renderer latar belakang.

GeneratePdfJob menerima builder callable dan satu jalur keluaran. Job memvalidasi jalur yang tidak aman saat dieksekusi. Kode aplikasi tetap sebaiknya memilih root penyimpanan yang aman untuk tenant sebelum dispatch.

<?php
use App\Pdf\Builders\QueuedInvoiceBuilder;
use NextPDF\Laravel\Jobs\GeneratePdfJob;
GeneratePdfJob::dispatch(
outputPath: storage_path('app/pdfs/invoice-1234.pdf'),
builder: [QueuedInvoiceBuilder::class, 'build'],
)->onQueue(config('nextpdf.queue.queue', 'pdf'));

Jaga agar callback queue tetap kecil. Sebaiknya tulis status persisten dari listener job aplikasi, alih-alih menyimpan closure kompleks di dalam payload queue.

Titik ekstensiGunakan untukBatasan
PdfDocumentInterface bindingMengganti atau mendekorasi pembuatan dokumen untuk nilai standar di seluruh aplikasi.Harus mengembalikan instance dokumen yang baru.
DocumentFactoryInterfaceMembuat dokumen baru secara eksplisit di dalam service dan pengujian.Jangan cache dokumen yang dikembalikan.
config/nextpdf.phpNilai standar, pengaturan queue, pengaturan renderer Chrome, hook penandatanganan, cache TSA, OCSP.Perlakukan variabel lingkungan sebagai konfigurasi deployment, bukan input permintaan.
GeneratePdfJob builderMembangun dokumen secara asinkron.Callable harus dapat diserialisasi oleh transport queue Laravel.
Callback keberhasilan/kegagalanNotifikasi atau pembersihan pascagenerasi.Jaga agar callback tetap idempoten dan memperhitungkan efek samping.
Kontrak Premium opsionalEmbedder e-invoice, validator, profil, dan runner Schematron.Resolusikan hanya di tempat paket opsional terpasang dan berlisensi.
  1. Bangun dokumen pertama secara sinkron di dalam controller atau feature test.
  2. Pindahkan kode tata letak ke dalam kelas builder di bawah app/Pdf/Builders.
  3. Pindahkan logika query dan otorisasi ke dalam service aplikasi.
  4. Tambahkan pengujian PdfResponse untuk header dan nama berkas.
  5. Pindahkan pembuatan yang lambat atau bervolume tinggi ke GeneratePdfJob.
  6. Tambahkan pengujian queue untuk konteks terserialisasi, kebijakan jalur keluaran, dan penanganan kegagalan.
  7. Ukur memori dan waktu render dengan data produksi yang representatif.
KegagalanDi mana harus ditanganiRespons yang direkomendasikan
Permintaan tidak valid atau dokumen tidak diotorisasiController atau policy.Kembalikan respons otorisasi atau validasi normal milik aplikasi.
Fon hilang atau gambar tidak validPengujian builder dan pencatatan log aplikasi.Gagalkan permintaan atau job; jangan keluarkan PDF parsial.
Jalur keluaran yang tidak amanService penyimpanan aplikasi dan GeneratePdfJob.Tolak sebelum dispatch dan andalkan validasi di sisi worker sebagai pertahanan berlapis.
Kegagalan penandatanganan atau TSABatas service penandatanganan.Putuskan apakah dokumen boleh tidak ditandatangani; gunakan default gagal-tertutup untuk dokumen yang tunduk pada regulasi.
Timeout queueKonfigurasi queue worker dan observabilitas.Coba ulang hanya saat builder bersifat deterministik dan jalur keluaran aman untuk ditimpa.
AspekNilai standarKapan menggantinya
Nama queuepdfGunakan queue khusus saat pembuatan PDF bersaing dengan job yang menghadap pengguna.
Timeout job120 detikTingkatkan hanya setelah mengukur ukuran dokumen dan kapasitas worker.
Nama berkas responsdocument.pdfGunakan identifier bisnis yang telah disanitasi.
Registry fonDigunakan bersama dan dikunci setelah pemanasan.Tambahkan preload_fonts untuk fon yang dipakai pada jalur sibuk.
Registry gambarCache terbatas yang digunakan bersama.Turunkan image_cache_mb untuk worker dengan keterbatasan memori.
Pemecahan chunk pada respons yang dialirkanChunk 64 KB.Jangan bergantung pada batas chunk; itu adalah detail keluaran.
  • Pengujian controller memverifikasi Content-Type, Content-Disposition, dan header defensif.
  • Pengujian builder menggunakan DTO deterministik dan tidak melakukan query ke basis data.
  • Pengujian queue memverifikasi bahwa builder menerima dokumen yang baru.
  • Pengujian jalur mencakup penolakan traversal, stream-wrapper, null-byte, dan non-.pdf.
  • Pengujian worker merender dokumen yang representatif di bawah batas memori yang sama dengan produksi.
  • Pengujian penandatanganan opsional mencakup sertifikat hilang, kata sandi tidak valid, TSA tidak tersedia, dan level tanda tangan yang dikonfigurasi.