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.

La opción --batched de Laravel: agrupación instantánea de trabajos

#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.

Antonio Jenaro

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.

Archivado en:

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