Queue Jobs
La clase GeneratePdfJob proporciona un job en cola listo para usar para delegar la generación de PDF a workers en segundo plano. Acepta un callback builder, escribe el resultado en una ruta dada y soporta hooks de éxito/fallo, lógica de reintentos y dispatch por lotes.
php
use Yeeefang\TcpdfNext\Laravel\Jobs\GeneratePdfJob;Dispatch básico
Pasa un callback que recibe un Document fresco y una ruta de salida:
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');El job resuelve un Document desde el contenedor, lo pasa a tu callback, luego escribe la salida.
Parámetros del constructor
| Parámetro | Tipo | Descripción |
|---|---|---|
callback | Closure(Document): void | Builder que genera el PDF |
outputPath | string | Ruta de destino (absoluta o relativa a la raíz del disco) |
disk | ?string | Disco del filesystem de Laravel (predeterminado: null para archivo local) |
onSuccess | ?Closure(string): void | Se llama con la ruta de salida en caso de éxito |
onFailure | ?Closure(Throwable): void | Se llama con la excepción en caso de fallo |
Callbacks de éxito y fallo
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');Lógica de reintentos
Se soporta la configuración estándar de reintentos de 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]);Los valores predeterminados de reintentos pueden establecerse en config/tcpdf-next.php bajo la clave queue.
Configuración de conexión de cola
Enruta los jobs de PDF a una conexión dedicada:
php
GeneratePdfJob::dispatch(
callback: fn (Document $pdf) => $pdf->addPage()->cell(0, 10, 'Hello'),
outputPath: storage_path('output.pdf'),
)
->onConnection('redis')
->onQueue('pdf-generation')
->afterCommit();Generación de PDF por lotes
Usa Bus::batch() para generar múltiples PDFs en paralelo:
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();Próximos pasos
- Facade Pdf -- Crear documentos usados por el callback del job
- Respuestas HTTP -- Servir PDFs generados a los usuarios
- Configuración -- Conexión de cola y valores predeterminados de reintentos