Laravel 13.25 додає глобальний перемикач паузи, що дозволяє зупинити всі черги на всіх з’єднаннях однією командою. Також оновлено artisan dev — тепер він використовує термінальний інтерфейс із вкладками, а об’єкти Image можна повертати безпосередньо з маршрутів. Команда Laravel випустила версію 13.25.0 11 серпня 2026 року.
- Команди
queue:pause --allтаqueue:resume --all, а також методиQueue::pauseAll()іQueue::resumeAll(). artisan devтепер працює через@laravel/multiplexіз підтримкою вкладок, стрім-режиму та інлайн-виводу.Imageреалізує інтерфейсResponsable, отримав методImage::fromStream(), аtoFormat()став публічним.- Нова подія
UniqueJobSkipped, значення таймауту вJobTimedOutта підтримка fail-on-timeout для сповіщень. - Метод
withoutCookies()для відповідей та хелпер міграційforeignUlidFor(). Request::all()тепер надає пріоритет текстовим даним перед файлами у разі збігу імен ключів.
# Що нового
# Пауза для всіх черг на всіх з’єднаннях
Laravel вже мав можливість зупиняти окремі черги, проте під час деплою це було незручно: доводилося зупиняти кожну пару з’єднання та черги за назвою. Використання режиму обслуговування (maintenance mode) замість цього вимикає весь сайт, хоча потрібно лише, щоб воркери перестали брати нові завдання.
Тепер консольні команди підтримують прапор --all:
php artisan queue:pause --all
php artisan queue:resume --all
Аргумент назви черги став необов’язковим, а відповідні методи з’явилися у фасаді:
use Illuminate\Support\Facades\Queue;
Queue::pauseAll();
Queue::resumeAll();
Глобальний перемикач використовує єдиний ключ у кеші, який воркери перевіряють разом із ключами окремих черг. Це означає, що isPaused() поверне true, якщо активовано хоча б один із рівнів паузи. Ці рівні незалежні: resumeAll() знімає лише глобальний прапор, залишаючи індивідуально зупинені черги на паузі. Це зроблено навмисно, щоб скрипт деплою випадково не запустив чергу, яку адміністратор зупинив вручну.
Додано нові події QueuesPaused та QueuesResumed. Автор оновлення — @jackbayliss.
# artisan dev на базі @laravel/multiplex
Раніше команда artisan dev використовувала concurrently, що змішувало вивід усіх процесів у єдину стрічку. Коли Vite, воркер черги та Pail пишуть логі одночасно, пошук потрібного рядка перетворювався на складне завдання.
Тепер команда працює через @laravel/multiplex — термінальний інтерфейс, де кожен процес має власну вкладку. Додано пошук, можливість перезапуску окремих процесів, очищення логів та автозапуск у разі збою. Доступні три режими: tabs (за замовчуванням), stream (спільна стрічка з можливістю пошуку) та inline (звичайний вивід без TTY). Режим можна обрати під час запуску:
php artisan dev --stream
php artisan dev --timestamps --no-restart
Налаштування можна задати глобально у Service Provider:
use Illuminate\Foundation\DevCommands;
DevCommands::stream();
DevCommands::withTimestamps();
DevCommands::disableAutoRestart();
DevCommands::bufferSize(5000);
Після завершення роботи команди буферизовані логи виводяться в основний термінал. Windows тимчасово використовує concurrently, оскільки мультиплексування наразі підтримує лише macOS та Linux. Автор — @joetannenbaum.
# Зображення як HTTP-відповіді
Раніше native image API дозволяв трансформувати та зберігати зображення, але для відправки його клієнту через HTTP доводилося викликати toBytes() і вручну формувати відповідь. Тепер Image реалізує Responsable, що дозволяє повертати інстанс прямо з маршруту:
use Illuminate\Support\Facades\Image;
Route::get('/avatars/{user}', function (User $user) {
return Image::fromStorage($user->avatar_path)
->cover(200, 200)
->toWebp()
->quality(80);
});
Метод toResponse() автоматично встановлює статус 200 та заголовок Content-Type відповідно до формату обробленого зображення.
Також додано метод Image::fromStream() для створення об’єкта з ресурсу потоку (stream) та зроблено метод toFormat() публічним. Це спрощує динамічну зміну формату на основі вхідних даних від користувача. Автор покращень — @calebdw.
# Покращення моніторингу черг
Завдання, які не потрапляли в чергу через обмеження ShouldBeUnique, раніше зникали безслідно. Нова подія UniqueJobSkipped дозволяє відстежувати такі випадки та логувати інформацію про пропущене завдання.
Подія JobTimedOut отримала нову властивість $timeout, що містить кількість секунд, після яких стався таймаут. Це дозволяє розрізнити таймаут самого завдання від таймауту воркера.
Сповіщення (notifications) тепер підтримують властивість $failOnTimeout або атрибут #[FailOnTimeout]. Це важливо, коли через таймаут незрозуміло, чи була доставлена подія через сторонній сервіс.
Крім того, QueueFake тепер призначає UUID фейковим завданням, що робить тестування коду, який покладається на ідентифікатори завдань, точнішим.
# Метод withoutCookies() для відповідей
Замість того, щоб викликати withoutCookie() для кожної назви окремо, тепер можна передати масив:
return response('OK')->withoutCookies(['session', 'tracking', 'preferences']);
Метод підтримує необов'язкові аргументи $path та $domain, які застосовуються до всіх вказаних cookie. Автор — @xurshudyan.
# Хелпер foreignUlidFor() у схемах БД
Додано метод foreignUlidFor(), який доповнює існуючі foreignIdFor() та foreignUuidFor(). Він автоматично визначає назву колонки, пов’язану таблицю та ключ на основі моделі:
$table->foreignUlidFor(User::class)->constrained();
Команда створює колонку типу char(26) із відповідним обмеженням зовнішнього ключа. Автор — @talaridisTh.
# Request::all() надає пріоритет вхідним даним
Раніше Request::all() об’єднував звичайні поля та завантажені файли так, що файли мали пріоритет. Тепер порядок змінено: якщо імена текстового поля та файлу збігаються, all() поверне значення текстового поля. Це не впливає на метод file(), який і надалі повертатиме об'єкт файлу. Автор — @taylorotwell.
# Інші виправлення та покращення
- Додано
Factory::withoutGlobalConfiguration()для ізоляції внутрішнього трафіку фреймворку від глобальних налаштувань HTTP-клієнта. - Виправлено скидання завдань для широкомовних подій (broadcast events), якщо модель була видалена до початку обробки.
Gate::forUser()тепер коректно копіює кастомні відповіді про відмову в доступі.Str::substrReplace()тепер коректно працює з масивами, делегуючи виклик нативній функції PHP.- Покращено підтримку переліків (enums) для назв черг у поштових відправленнях.
- Виправлено помилку
TypeErrorу режимі обслуговування з використанням кешу. - Оновлено підтримку бібліотеки
brick/mathдо версії ^0.19.
Посилання