Queue::forward(): перенаправляйте Laravel queues в одному місці

Перекладено ШІ 0 Laravel News 21 серпня, 2026

Нова функція Queue::forward() у Laravel 13.26 дозволяє миттєво перенаправляти завдання між чергами та з'єднаннями без редагування десятків класів. Це просте рішення позбавляє потреби у складному рефакторингу та значно полегшує масштабування інфраструктури в один рядок коду.

Назви черг часто «зашиваються» в коді: від параметрів onQueue('reports') у класах Job до налаштувань onConnection('redis') під час виклику. Коли черга звітів починає перевантажувати систему, і ви хочете винести її на окремий Redis-інстанс або перейти на FIFO-черги в хмарі, доводиться вносити правки всюди, включно зі сторонніми пакетами, на які ви не маєте впливу.

Laravel 13.26 розв'язує цю проблему за допомогою методу Queue::forward(), запропонованого @jackbayliss у #61188. Тепер можна в одному місці вказати, що завдання для певної черги мають потрапляти на іншу чергу чи з'єднання. Весь інший код продовжує звертатися до reports, а forward визначає актуальний шлях.

# API

Метод дозволяє гнучко налаштовувати переспрямування:

use Illuminate\Support\Facades\Queue;
 
// Змінити назву черги та перенести її на інше з'єднання
Queue::forward('reports', 'reports.fifo', 'cloud');
 
// Змінити лише з'єднання, залишивши назву черги
Queue::forward('payments', connection: 'cloud');
 
// Перейменувати чергу в межах одного з'єднання
Queue::forward('updates', 'notifications');
 
// Перенаправити кілька черг одночасно
Queue::forward([
    'reports' => 'reports.fifo',
    'emails' => 'emails.fifo',
], connection: 'cloud');

Назви черг можуть бути рядками або Backed Enums. Виклики варто розміщувати в методі boot() сервіс-провайдера. Нова функція інтегрована в ядро через той самий хук getConnection(), що й Queue::route(), тому вона працює з усіма драйверами без додаткових змін у їхньому коді.

Важливий нюанс: якщо у forward вказано конкретне з'єднання, перейменування спрацює лише для завдань, що прямують саме туди. Наприклад, Queue::forward('reports', 'reports.fifo', 'cloud') перенаправить загальні виклики reports у хмару, але завдання, явно відправлені на reports через з'єднання redis, залишаться без змін. Це точкове зіставлення, а не глобальна автозаміна.

# Маршрутизація залежно від середовища

Завдяки реєстрації у провайдері, маршрутизацію легко зробити умовною, що значно зручніше за статичні конфіг-файли. Класичний приклад — використання Redis локально та керованого сервісу в продакшені:

namespace App\Providers;
 
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        if ($this->app->isProduction()) {
            Queue::forward([
                'reports' => 'reports.fifo',
                'emails' => 'emails.fifo',
            ], connection: 'cloud');
        }
    }
}

Тепер у локальному середовищі dispatch(new GenerateReport) піде в Redis-чергу reports, а в продакшені той самий код автоматично спрямує завдання в reports.fifo на хмарному з'єднанні. Більше жодних перевірок середовища всередині Job-класів або складних маніпуляцій у config/queue.php.

Це також спрощує оперативне керування навантаженням:

// Якщо черга обробки відео перевантажує основний Redis:
Queue::forward('encoding', connection: 'redis-heavy');
 
// Тестування нового з'єднання на одній другорядній черзі:
Queue::forward('notifications', connection: 'sqs-experiment');

Оскільки переспрямування додається одним рядком, відкат змін відбувається так само просто — видаленням цього рядка. Це робить поступову міграцію черг максимально безпечною.

# Чого Forwarding не робить

Переспрямування працює лише в момент відправки завдання (dispatch). Завдання, які вже знаходяться в черзі, залишаться на старому місці. Тому під час міграції важливо залишити воркери на старій черзі, поки вони не вичерпають її залишок. Одночасна робота воркерів зі старими та новими назвами протягом тривалого часу може призвести до race conditions, тому стару чергу слід вважати застарілою і вимикати її воркери одразу після очищення.

Варто зауважити: `forward` лише змінює шлях, він не зупиняє і не обмежує потік завдань. Для призупинення обробки використовуйте Queue Pause API з Laravel 13.25. Якщо ж проблема в занадто великій кількості подій, зверніть увагу на Debounced Listeners, які з’явилися в цьому ж релізі.

# Що почитати

Популярні

Інше, що варто прочитати

15 Оновлено 26 червня, 2026

Локальні моделі та їх скоупи в Laravel за допомогою атрибута Scope

В Laravel 12 ми отримали можливість використовувати новий підхід для визначення локальних скоупів у моделях Eloquent. Дізнайтеся, як новий атрибут #[Scope] спрощує цей процес і зберігає ваші назви методів незмінними

16 Оновлено 26 червня, 2026

Журнал аудиту в Laravel

Хочете забезпечити повну прозорість у своїх Laravel-додатках? Пакет Laravel Audit Log допоможе вам детально відстежувати всі зміни моделей Eloquent та відповідати вимогам регуляторів. Читайте далі, щоб дізнатися, як цей потужний інструмент може підвищити надійність вашого проєкту

13 Оновлено 26 червня, 2026

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!