La opción --batched de Laravel: agrupación instantánea de trabajos
- Publicado el 29 septiembre, 2025
- Palabras: 190
El comando make:job de Laravel ahora incluye la opción --batched que estructura automáticamente todo lo necesario para la agrupación de trabajos. Se acabaron los tiempos de recordar qué traits importar y qué métodos implementar.

#El antiguo proceso manual frente al nuevo enfoque simplificado
Anteriormente, configurar un job por lotes requería varios pasos manuales. Se creaba un job normal y luego se añadían manualmente los atributos y el código repetitivo necesario:
// Step 1: Create the job
php artisan make:job ProcessPodcast
// Step 2: Manually add traits and cancellation logic
use Illuminate\Bus\Batchable;
use Illuminate\Contracts\QueueShouldQueue;
use Illuminate\Foundation\QueueQueueable;
class ProcessPodcast implements ShouldQueue
{
use Batchable, Queueable; // Remember to add these
public function handle(): void
{
if ($this->batch()->cancelled()) {
return;
}
// Your logic here
}
}
Ahora, un solo comando con la opción --batched genera todo lo que necesitas:
php artisan make:job ProcessPodcast --batched
Esto crea automáticamente un job por lotes totalmente configurado con todas las características necesarias y manejo de cancelaciones incorporado.
#Ejemplo práctico
Imagina que estás creando una plataforma de podcast que necesita procesar múltiples archivos de audio al subir una nueva temporada. Cada episodio requiere transcripción, generación de miniaturas y extracción de metadatos.
<?php
namespace AppJobs;
use App\Models\Episode;
use Illuminate\Bus\Batchable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Bus;
class ProcessEpisode implements ShouldQueue
{
use Batchable, Queueable;
public function __construct(
public Episode $episode
) {}
public function handle(): void
{
if ($this->batch()->cancelled()) {
return;
}
// Process the episode
$this->generateTranscript();
$this->createThumbnail();
$this->extractMetadata();
$this->episode->update(['status' => 'processed']);
}
private function generateTranscript(): void
{
// AI transcription logic
}
private function createThumbnail(): void
{
// Image processing logic
}
private function extractMetadata(): void
{
// Metadata extraction logic
}
}
class SeasonController
{
public function processSeason(Season $season)
{
$jobs = $season->episodes->map(
fn($episode) => new ProcessEpisode($episode)
);
$batch = Bus::batch($jobs)
->name("Process Season: {$season->title}")
->onQueue('media-processing')
->dispatch();
return response()->json([
'batch_id' => $batch->id,
'total_jobs' => $batch->totalJobs
]);
}
}
La opción --batched garantiza que la clase job incluya la comprobación de cancelación crítica desde el principio. Esto evita episodios parcialmente procesados al cancelar un lote, manteniendo así la consistencia de los datos en toda la aplicación.
El código repetitivo generado también deja claro de inmediato que este trabajo está diseñado para el procesamiento por lotes, lo que mejora la legibilidad del código y la comprensión del equipo. Los nuevos desarrolladores pueden reconocer al instante las capacidades de procesamiento por lotes del trabajo sin tener que profundizar en los detalles de la implementación.

Desarrollador backend especializado en PHP y Laravel, con sede en Santander, Cantabria. Más de 15 años de experiencia en el desarrollo de aplicaciones web a medida y en la modernización de código heredado.
Fuente: Harris Raftopoulos
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión