تخطَّ إلى المحتوى

دليل مطوّري Laravel

تتكيف حزمة ⁨Laravel NextPDF⁩ مع أعراف ⁨Laravel⁩ دون تغيير دورة حياة المستند الأساسية. تملك الحاوية السجلّات والمصانع المشتركة. كل مستند ⁨PDF⁩ قابل للتخلص منه، لذا يجب بناؤه أو إرجاعه أو دفقه أو حفظه مرة واحدة فقط.

استخدم هذا الدليل عند تصميم خدمات التطبيق أو مهام قائمة الانتظار أو تدفقات الاستجابة أو تغطية الاختبارات لـ nextpdf/laravel.

الطبقةمملوكة منالمسؤوليةلا تضع هنا
المتحكّمالتطبيقتفويض الطلب، واختيار باني المستند، وإرجاع الاستجابة.قواعد تخطيط ⁨PDF⁩ المشتركة بين حالات الاستخدام.
خدمة التطبيقالتطبيقجمع بيانات المجال واستدعاء كود بناء المستند.منطق إقلاع الحاوية أو إعدادات الحزمة.
باني المستندالتطبيقترجمة بيانات المجال إلى استدعاءات مستند ⁨NextPDF.⁩كائنات الطلب، أو منطق استعلام ⁨Eloquent⁩، أو تفاصيل نقل قائمة الانتظار.
تكامل ⁨Laravel⁩nextpdf/laravelربط المصانع، والسجلّات، والموقّع، وعميل ⁨TSA⁩، والواجهة، والاستجابات، ومهمة قائمة الانتظار.مسارات التخزين الخاصة بالأعمال أو سياسة المستأجر.
المحرّك الأساسيnextpdf/nextpdfبناء ملف ⁨PDF⁩ وتسلسله.سياسة استجابة ⁨Laravel⁩، أو قائمة الانتظار، أو نظام الملفات.
المرحلةالسلوكإجراء المطوّر
تسجيل مزوّد الخدمةيسجّل NextPdfServiceProvider::register() السجلّات المشتركة، ومصنع المستندات، وربط المستند، وعميل ⁨HTTP⁩، وعميل سلطة الطوابع الزمنية (⁨TSA⁩)، والموقّع، وعقود الفاتورة الإلكترونية الاختيارية.انشر config/nextpdf.php وراجعه قبل الإنتاج.
دقة المستندتحلّ واجهة Pdf وربط PdfDocumentInterface مستندًا جديدًا عبر DocumentFactoryInterface.حلّ مستندًا مرة واحدة لكل طلب، أو أمر، أو مهمة في قائمة الانتظار.
التأليفيستدعي كود التطبيق واجهات برمجة المستند الأساسية عبر الواجهة أو المستند المحقون.أبقِ استخراج بيانات المجال خارج باني المستند.
الخرج النهائييصدر PdfResponse خرج ⁨HTTP⁩، أو يُحفظ المستند على القرص.اختر مسار خرج نهائيًا واحدًا لكل مستند.
تنفيذ قائمة الانتظاريعيد GeneratePdfJob بناء المستند في العامل ويتحقق من مسار الخرج مرة أخرى.مرّر سياقًا عدديًا وأبقِ ردود النداء عديمة التأثير الجانبي عند التكرار.
المسارالغرض
app/Pdf/Builders/*بناة مستندات خالصون يتلقون البيانات ويُرجعون مستندًا مكتملًا.
app/Pdf/Data/*كائنات نقل بيانات صغيرة (⁨DTOs⁩) تحمل مدخلات المستند المُفوّضة مسبقًا.
app/Services/*تنسيق التطبيق، والاستعلامات، وتسليم التفويض، واختيار مسار التخزين.
app/Jobs/*أغلفة اختيارية حول GeneratePdfJob عندما يحتاج التطبيق إلى مهام مُسمّاة.
tests/Feature/Pdf/*اختبارات استجابة ⁨HTTP⁩، وإرسال قائمة الانتظار، والتفويض.
tests/Unit/Pdf/*اختبارات الباني بمدخلات حتمية صغيرة.

أبقِ البناة مستقلين عن كائنات طلب ⁨Laravel.⁩ ينبغي أن تتمكّن من استدعاء الباني من متحكّم، أو أمر، أو اختبار، أو عامل قائمة انتظار بالمدخلات نفسها.

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

استخدم حقن المُنشئ عندما يكون تدفق ⁨PDF⁩ جزءًا من منطق التطبيق. استخدم الواجهة فقط في تدفقات المتحكّم القصيرة عندما يكون النمط الساكن أسهل قراءة.

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

تجسّد مساعدات الاستجابة بايتات المستند قبل بناء استجابة ⁨Laravel.⁩ فهي مساعدات استجابة، وليست مُصيّرات تعمل في الخلفية.

يقبل GeneratePdfJob قابلًا للاستدعاء للباني ومسار خرج. تتحقق المهمة من المسارات غير الآمنة وقت التنفيذ. ومع ذلك، ينبغي لكود التطبيق اختيار جذر تخزين آمن للمستأجر قبل الإرسال.

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

أبقِ ردود نداء قائمة الانتظار صغيرة. يُفضّل كتابة الحالة الدائمة من مستمع مهام التطبيق بدل تخزين إغلاقات معقّدة في حمولة قائمة الانتظار.

نقطة التوسيعاستخدمها لـالقيد
ربط PdfDocumentInterfaceاستبدال إنشاء المستند أو تزيينه لإعدادات افتراضية على مستوى التطبيق.يجب أن يُرجع نسخة مستند جديدة.
DocumentFactoryInterfaceأنشئ مستندات جديدة صراحةً في الخدمات والاختبارات.لا تخزّن المستندات المُرجَعة مؤقتًا.
config/nextpdf.phpالإعدادات الافتراضية، وإعدادات قائمة الانتظار، وإعدادات مُصيّر ⁨Chrome⁩، وخطافات التوقيع، و⁨TSA⁩، وذاكرة ⁨OCSP⁩ المؤقتة.تعامل مع متغيرات البيئة بوصفها إعدادات نشر، وليست مدخلات طلب.
باني GeneratePdfJobبناء المستندات بشكل غير متزامن.يجب أن يكون القابل للاستدعاء قابلًا للتسلسل عبر ناقل قائمة انتظار ⁨Laravel.⁩
ردود نداء النجاح/الفشلإشعار ما بعد التوليد أو التنظيف.أبقِ ردود النداء عديمة التأثير عند التكرار وواعية بالآثار الجانبية.
عقود ⁨Premium⁩ الاختياريةمُضمِّن الفاتورة الإلكترونية، والمدقّق، والملف الشخصي، ومشغّل ⁨Schematron.⁩حلّها فقط حيث تكون الحزمة الاختيارية مثبّتة ومرخّصة.
  1. ابنِ المستند الأول بشكل متزامن في متحكّم أو اختبار ميزة.
  2. انقل كود التخطيط إلى صنف بانٍ ضمن app/Pdf/Builders.
  3. انقل منطق الاستعلام والتفويض إلى خدمة تطبيق.
  4. أضف اختبارات PdfResponse للترويسات وأسماء الملفات.
  5. انقل التوليد البطيء أو كبير الحجم إلى GeneratePdfJob.
  6. أضف اختبارات قائمة انتظار للسياق المُسلسل، وسياسة مسار الخرج، ومعالجة الفشل.
  7. قِس الذاكرة وزمن التصيير ببيانات إنتاج تمثيلية.
الفشلحيث ينبغي معالجتهالاستجابة الموصى بها
طلب غير صالح أو مستند غير مُفوّضالمتحكّم أو السياسة.أرجِع استجابة التفويض أو التحقق المعتادة في التطبيق.
خط مفقود أو صورة غير صالحةاختبار الباني وتسجيل التطبيق.أفشِل الطلب أو المهمة؛ لا تُصدِر ملفات ⁨PDF⁩ جزئية.
مسار خرج غير آمنخدمة تخزين التطبيق وGeneratePdfJob.ارفض قبل الإرسال واعتمد على التحقق من جانب العامل بوصفه دفاعًا في العمق.
فشل التوقيع أو ⁨TSA⁩حدود خدمة التوقيع.قرّر ما إذا كان يجوز ترك المستند دون توقيع؛ والافتراضي هو الفشل المغلق للمستندات المنظّمة.
انتهاء مهلة قائمة الانتظارإعدادات عامل قائمة الانتظار وقابلية المراقبة.أعِد المحاولة فقط عندما يكون الباني حتميًا ويكون مسار الخرج آمنًا للكتابة فوقه.

الإعدادات الافتراضية الآمنة

قسم بعنوان «الإعدادات الافتراضية الآمنة»
الجانب المعنيالافتراضيمتى تتجاوزه
اسم قائمة الانتظارpdfاستخدم قائمة انتظار مخصصة عندما يتنافس التوليد مع المهام الموجّهة إلى المستخدم.
مهلة المهمة120 ثانيةزِدها فقط بعد قياس حجم المستند وسعة العامل.
اسم ملف الاستجابةdocument.pdfاستخدم معرّفات أعمال مُطهّرة.
سجلّ الخطوطمشترك ومقفل بعد الإحماء.أضف preload_fonts للخطوط المستخدمة في المسارات الساخنة.
سجلّ الصورذاكرة مؤقتة مشتركة ومحدودة.خفّض image_cache_mb للعمّال المحدودي الذاكرة.
تقسيم الاستجابة المدفوقة إلى كتلكتل بحجم 64 ⁨KB.⁩لا تعتمد على حدود الكتل؛ فهي تفصيل من تفاصيل الخرج.
  • تتحقق اختبارات المتحكّم من Content-Type، وContent-Disposition، والترويسات الدفاعية.
  • تستخدم اختبارات الباني كائنات ⁨DTO⁩ حتمية ولا تستعلم من قاعدة البيانات.
  • تتحقق اختبارات قائمة الانتظار من أن الباني يتلقى مستندًا جديدًا.
  • تغطي اختبارات المسار الاجتياز، ومُغلِّف الدفق، والبايت الصفري، ورفض غير .pdf.
  • تُصيّر اختبارات العامل مستندات تمثيلية ضمن حد الذاكرة نفسه المستخدم في الإنتاج.
  • تغطي اختبارات التوقيع الاختيارية الشهادة المفقودة، وكلمة المرور غير الصالحة، وعدم توفر ⁨TSA⁩، ومستوى التوقيع المُهيّأ.