Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 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

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

Коментарі

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

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

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

Filament v5.10.0
Новини 12 жовтня 2026

Filament v5.10.0: сітка в rich editor, скелетони таблиць і десятки виправлень

Вийшов Filament v5.10.0: елементи керування сіткою в rich editor, допоміжний контент для віджетів-графіків, скелетони завантаження таблиць, submitOnCompletion() для OneTimeCodeInput та багато виправлень авторизації, доступності й стану.

15
Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

11

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

Altris AI Нова
Сьогодні

Senior PHP Backend Developer

Розробник створюватиме та підтримуватиме інтерфейси веб-застосунку на PHP, розширюватиме наявні модулі, писатиме модульний і масштабований код та бере участь в оцінці й пріоритизації завдань. Ключовий стек: PHP, Laravel, SQL (PostgreSQL, MySQL), NoSQL (MongoDB, Redis), Docker, CI/CD. Вимоги: понад 5 років досвіду PHP backend-розробником, написання тестів (PHPUnit), якісна документація, англійська B1.

SevenPro Нова
Сьогодні

PHP Full-stack Engineer (part-time)

Розробник PHP full-stack на неповний робочий день для підтримки та поетапної модернізації існуючої PHP-платформи для HR. Завдання: аналіз legacy-коду, перенесення частини адміністративних функцій на самообслуговування клієнта та розробка модулів Time Tracking, підготовки розрахунку зарплат і ESG, а також інтеграції із зовнішніми сервісами. Вимоги: понад 3 роки комерційного досвіду з PHP, досвід роботи з legacy-системами, знання MySQL або MariaDB, HTML, CSS, Bootstrap, jQuery, AJAX, англійська B2

Global Logistics Нова
Сьогодні

Програміст PHP Full stack Developer

Розробник PHP (фулстек) для розробки та підтримки веб-додатків. Основний стек: PHP 7x/8x, MySQL, Yii 2.0, JavaScript, Vue.js, REST API. Вимоги: 3+ років досвіду на PHP, 2+ років з Yii 2.0, знання MySQL на просунутому рівні, Git, CSS, jQuery. Будуть плюсом: Laravel, Redis, WebSocket, RabbitMQ, Firebase. Робота над власними продуктами компанії (CRM логістичних процесів), робота у команді, code review.

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

Bagisto

bagisto/bagisto

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

28,224 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,779 15.37.4 12