Чистіші черги з використанням Enum у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 березня, 2025
Laravel тепер підтримує безпосереднє використання задніх enum з методом onQueue фасаду Bus, що спрощує код при роботі з чергами. Дізнайтеся, як це вдосконалення може підвищити ефективність вашої системи обробки документів і зробити код більш зрозумілим!

Laravel тепер дозволяє безпосереднє використання бекенд-енумів у методі onQueue фасаду Bus, що усуває необхідність вручну отримувати значення властивості енуму. Це покращення забезпечує чистіший і зрозуміліший код при роботі з ланцюгами завдань та чергами.

Особливо ця можливість корисна при створенні складних пайплайнів завдань, які можуть бути спрямовані в різні черги залежно від пріоритету, ресурсних вимог або бізнес-логіки.

use App\Enums\QueueType;
 
// Використовуйте енум без ->value
Bus::chain($jobs)
    ->onQueue(QueueType::Background)
    ->dispatch();

Ось практичний приклад реалізації системи обробки документів:

<?php
 
namespace App\Enums;
 
enum ProcessingQueue: string
{
    case Immediate = 'realtime';
    case Standard = 'default';
    case Batch = 'batch-process';
    case LowPriority = 'low-priority';
}
 
namespace App\Services;
 
use App\Enums\ProcessingQueue;
use App\Jobs\ProcessDocument;
use App\Jobs\GenerateThumbnail;
use App\Jobs\ExtractMetadata;
use App\Jobs\NotifyUser;
use App\Models\Document;
use Illuminate\Support\Facades\Bus;
 
class DocumentProcessor
{
    public function process(Document $document, bool $isPriority = false)
    {
        $queue = $isPriority
            ? ProcessingQueue::Immediate
            : ProcessingQueue::Standard;
 
        Bus::chain([
            new ProcessDocument($document),
            new ExtractMetadata($document),
            new GenerateThumbnail($document),
            new NotifyUser($document->user, 'Документ оброблено')
        ])
        ->onQueue($queue)
        ->dispatch();
 
        return $document;
    }
 
    public function batchProcess(array $documentIds)
    {
        foreach ($documentIds as $id) {
            $document = Document::find($id);
 
            Bus::chain([
                new ProcessDocument($document),
                new GenerateThumbnail($document)
            ])
            ->onQueue(ProcessingQueue::Batch)
            ->dispatch();
        }
    }
}

Цей функціонал спрощує реалізацію черг, зберігаючи при цьому типову безпеку та підвищуючи читабельність коду