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

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

8

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

Коментарі

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

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

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

PayZephyr
Новини 12 вересня 2026

PayZephyr: Єдиний API для роботи з Stripe, Paystack та PayPal

PayZephyr - Laravel-пакет від Nwaneri Chukwunyere Kenneth, який об'єднує вісім платіжних провайдерів під одним зручним API. Підтримує автоматичне перемикання, захист від подвійної оплати, підписки та повернення коштів.

2
Laravel Telescope
Новини 11 вересня 2026

Artisan-команди для дебагу в Laravel Telescope 5.24.0

Laravel Telescope 5.24.0 додає дві нові Artisan-команди для роботи із записами із терміналу. Тепер можна переглядати запити, винятки, джоби та запити до бази даних без відкриття веб-інтерфейсу, а також отримувати дані у форматі JSON для скриптів та AI-агентів.

3

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

Full Stack Developer (PHP, React, Middle, Middle+)

Full Stack розробник для підтримки та розвитку аналітичного продукту перевірки контрагентів. Робота зі складною бізнес-логікою, базами даних та інтеграцією AI-рішень. Стек: PHP 8.x (Laravel/Symfony), React, MySQL, REST API. Вимоги: 3+ років комерційного досвіду, глибоке розуміння SQL, Git, Docker, CI/CD, Linux, OWASP.

Програміст PHP (інтерн)

Вакансія на посаду інтерна PHP розробника для початківців з теоретичною базою ООП та базовими знаннями PHP. Потрібні навички Git/GitHub, власні проєкти. Стажування в офісі під керівництвом менторів з перспективою переходу на посаду Junior разробника.

Starlight Media Нова
2 дні тому

Senior Full-Stack Developer (PHP, Go, Vue.js)

Senior Full-Stack розробник для розвитку та підтримки веб-платформ. Основні завдання: розробка на PHP (Yii2, Laravel), Go, Vue.js, MySQL оптимізація, REST API, рефакторинг коду. Вимоги: 3+ років досвіду, PHP 8.x ООП, досвід Go або готовність його розвивати, JavaScript ES6+, Git, Docker, англійська B1-B2.

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

Bagisto

bagisto/bagisto

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

28,086 v2.5.0-beta1 13 25

Lang

laravel-lang/lang

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

7,774 15.34.8 11