Skip to content

Задания очереди

Класс 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, затем записывает результат.

Параметры конструктора

ПараметрТипОписание
callbackClosure(Document): voidПостроитель, заполняющий PDF
outputPathstringПуть назначения (абсолютный или относительный к корню диска)
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 пользователям
  • Конфигурация — Подключение очереди и настройки повторных попыток по умолчанию

Распространяется по лицензии LGPL-3.0-or-later.