Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 21 серпня 2026

Queue::forward(): маршрутизація Laravel-черг в одному місці

Назви черг мають властивість «вбудовуватися» всюди. Клас job встановлює onQueue('reports'), місце виклику додає ->onConnection('redis'), атрибут #[Queue] закріплює інше значення, а флот воркерів налаштований відповідно. Потім черга reports починає «душити» всі інші, і ви хочете винести її на окремий екземпляр Redis, або переносите production на керований сервіс черг, який вимагає FIFO-іменування - і зміна торкається кожного з цих місць одночасно, плюс сторонні пакети, що відправляють завдання у черги, які ви не контролюєте.

Новий метод Queue::forward()

Laravel 13.26 додає Queue::forward(), внесений @jackbayliss у #61188. Він оголошує в одному місці, що все, відправлене в певну чергу, має потрапити в іншу чергу, інше з'єднання або обидва варіанти. Класи job, місця виклику dispatch і vendor-пакети продовжують говорити 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 enum, відповідно до підтримки enum, яку черги отримали раніше. Виклики належать до методу boot() сервіс-провайдера, і вони компонуються з рештою системи черг, оскільки forwarding розв'язується через той самий хук getConnection(), який використовує Queue::route(), а перейменування застосовується власним механізмом розв'язання черг кожного драйвера. Немає нового контракту для реалізації користувацькими драйверами.

Тонкощі збігу

Одна тонкість у збігу: forward, що вказує з'єднання, перезаписує ім'я черги лише для job, які прямували до цього з'єднання. Queue::forward('reports', 'reports.fifo', 'cloud') перейменовує reports на з'єднанні cloud і переміщує туди нецільові виклики reports, але job, явно відправлена в reports на вашому з'єднанні redis, зберігає своє ім'я. Forwards - це маппінг, а не глобальний find-and-replace.

Маршрутизація за середовищем

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

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) йде в reports на Redis, і queue:work підбирає його як завжди. У production ідентичний код потрапляє в reports.fifo на керованому з'єднанні. Ніяких перевірок середовища в класах job і ніякої акробатики в config/queue.php, щоб одна назва черги означала дві речі.

Операційні переміщення

Та сама форма покриває операційні переміщення, які раніше вимагали deploy з торканням багатьох файлів:

// Черга encoding топить дефолтний екземпляр Redis:
Queue::forward('encoding', connection: 'redis-heavy');

// Випробувати нове з'єднання з однією нерискованою чергою перед комітом:
Queue::forward('notifications', connection: 'sqs-experiment');

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

Що forwarding не робить

Forward застосовується під час dispatch - до job, що входять у чергу з цього моменту. Job, що вже сидять у старій черзі, залишаються там, тому перемикання потребує воркерів, що дренують стару назву, доки вона не спорожніє. PR явно вказує на стаціонарний стан: тривале запуск воркерів проти оригінальної та перенаправленої назв запрошує race conditions, тому коли forward на місці, трактуйте стару назву як deprecated і виведіть її воркерів після дренажу.

Суміжні можливості

Кілька суміжних нюансів. Forwarding переписує призначення, він не призупиняє чи throttle нічого; для зупинки споживання є API паузи черг з Laravel 13.25. І якщо ваші listeners, а не jobs, є галасливою частиною системи, цей реліз також поставив debounced queued listeners, які атакують обсяг черги з іншого кінця.

Подальше читання

9

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Новини 27 жовтня 2026

Filament v5.11.0: поля й віджети на React, Vue і Svelte та жорсткіший захист Livewire

Filament v5.11.0 дозволяє писати власні поля форм, компоненти схем і віджети на React, Vue, Svelte або чистому JavaScript. Паралельно v5.11.0 і v4.16.0 закривають для клієнта внутрішні Livewire-методи та стан і додають опційні ліміти для репітерів і пагінації таблиць.

2
Новини 27 жовтня 2026

Livewire 4.4.8 закриває обхід #[Authorize], а NativePHP Mobile - сім вразливостей

Livewire 4.4.8 виправляє GHSA-mhf7-xp6r-6qrc (CVSS 6.5): атрибут #[Authorize] можна було обійти й виконати дію над чужим записом. Того ж тижня NativePHP опублікувала сім попереджень для NativePHP for Mobile - виправлення в nativephp/mobile 4.6.1 і 3.3.11, але до користувачів вони дійдуть лише з новою збіркою застосунку.

1

Вакансії за темою

levari Нова
Вчора

Senior Laravel Developer (Statamic), German-speaking preferred

Розробник на тривалий проєкт для клієнта німецького digital-агентства: оновлення існуючого сайту та екстранету на Statamic, зокрема великий апгрейд платформи до кінця листопада, далі розробка нових функцій. Ключовий стек: Laravel, Statamic, автентифікація та складна модель ролей і дозволів. Вимоги: понад 5 років комерційного досвіду з Laravel, досвід оновлення продакшн-застосунків, самостійність, робота з німецької IP-адреси через VPN. Бажано Vue.js та німецька від B2.

Middle Backend Engineer PHP/Laravel

Розробка бекенду для нової платформи запису й редагування відео з AI: REST API для керування контентом (S3-завантаження, метадані, мініатюри, планування), оркестрація задач обробки відео на AI-воркерах RunPod, інтеграції з платежами, аналітикою та AI-сервісами, WebSocket-синхронізація з клієнтами та фонові черги. Потрібен досвід із бекенд-фреймворками, проєктуванням баз даних, автентифікацією й безпекою API, роботою з вебхуками та Docker, Git і CI/CD.

Senior/Middle PHP Developer

Підтримка та розвиток великих веб-сайтів компанії (понад 1 млн відвідувань на місяць) на Laravel та OctoberCMS, інтеграція з внутрішніми системами та платіжними шлюзами (Приват24, Portmone, EasyPay, LiqPay), оптимізація продуктивності та робота з великим legacy-кодом без ризику для продакшену. Потрібен досвід PHP від 4 років, впевнена робота з Laravel і OctoberCMS, знання HTML5, CSS3 та JavaScript, вища освіта.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

28,282 v2.5.0 13 26

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,780 15.37.4 12