Задания очереди
Класс GeneratePdfJob предоставляет готовое к использованию задание для очереди, переносящее генерацию PDF на фоновые воркеры. Он принимает callback-построитель, записывает результат по указанному пути и поддерживает хуки успеха/ошибки, логику повторных попыток и пакетную диспетчеризацию.
php
use Yeeefang\TcpdfNext\Laravel\Jobs\GeneratePdfJob;Базовая диспетчеризация
Передайте callback, получающий свежий Document, и путь вывода:
php
use Yeeefang\TcpdfNext\Core\Document;
GeneratePdfJob::dispatch(
callback: function (Document $pdf) {
$pdf->setTitle('Monthly Report')
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Generated asynchronously');
},
outputPath: storage_path('reports/monthly.pdf'),
)->onQueue('pdf-generation');Задание разрешает Document из контейнера, передаёт его в ваш callback, затем записывает результат.
Параметры конструктора
| Параметр | Тип | Описание |
|---|---|---|
callback | Closure(Document): void | Построитель, заполняющий PDF |
outputPath | string | Путь назначения (абсолютный или относительный к корню диска) |
disk | ?string | Диск файловой системы Laravel (по умолчанию: null для локального файла) |
onSuccess | ?Closure(string): void | Вызывается с путём вывода при успехе |
onFailure | ?Closure(Throwable): void | Вызывается с исключением при ошибке |
Callback-и успеха и ошибки
php
GeneratePdfJob::dispatch(
callback: function (Document $pdf) {
$pdf->setTitle('Contract')
->addPage()
->setFont('Helvetica', 'B', 14)
->cell(0, 10, 'Service Agreement');
},
outputPath: 'contracts/SA-0042.pdf',
disk: 's3',
onSuccess: function (string $path) {
Notification::send($user, new ContractReady($path));
},
onFailure: function (Throwable $e) {
Log::error('Contract PDF failed', ['error' => $e->getMessage()]);
},
)->onQueue('pdf-generation');Логика повторных попыток
Поддерживается стандартная конфигурация повторных попыток Laravel:
php
GeneratePdfJob::dispatch(
callback: fn (Document $pdf) => $pdf->addPage()->cell(0, 10, 'Retry demo'),
outputPath: storage_path('reports/demo.pdf'),
)
->onQueue('pdf-generation')
->tries(3)
->backoff([10, 30, 60]);Значения повторных попыток по умолчанию можно установить в config/tcpdf-next.php в разделе queue.
Конфигурация подключения очереди
Направьте PDF-задания на выделенное подключение:
php
GeneratePdfJob::dispatch(
callback: fn (Document $pdf) => $pdf->addPage()->cell(0, 10, 'Hello'),
outputPath: storage_path('output.pdf'),
)
->onConnection('redis')
->onQueue('pdf-generation')
->afterCommit();Пакетная генерация PDF
Используйте Bus::batch() для параллельной генерации нескольких PDF:
php
use Illuminate\Support\Facades\Bus;
$jobs = $invoices->map(fn (Invoice $inv) =>
new GeneratePdfJob(
callback: function (Document $pdf) use ($inv) {
$pdf->setTitle("Invoice #{$inv->number}")
->addPage()
->setFont('Helvetica', 'B', 14)
->cell(0, 10, "Invoice #{$inv->number}");
},
outputPath: "invoices/{$inv->number}.pdf",
disk: 'local',
)
);
Bus::batch($jobs)
->name('Monthly Invoice Batch')
->onQueue('pdf-generation')
->allowFailures()
->then(fn () => Notification::send($admin, new BatchComplete()))
->catch(fn () => Log::warning('Some invoice PDFs failed'))
->dispatch();Далее
- Facade Pdf — Создание документов, используемых callback-ом задания
- HTTP-ответы — Доставка сгенерированных PDF пользователям
- Конфигурация — Подключение очереди и настройки повторных попыток по умолчанию