Призупинення всіх черг та новий UI для artisan dev у Laravel 13.25

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

Laravel 13.25 впроваджує глобальну паузу для всіх черг та оновлює `artisan dev` сучасним термінальним інтерфейсом із табами. Також реліз дозволяє повертати об’єкти `Image` безпосередньо з маршрутів та покращує observability для ваших jobs.

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.

Посилання

Популярні

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

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

Все, що потрібно знати про Laravel 13

Laravel 13 вийде в березні 2026 року й вимагатиме мінімум PHP 8.3. Хочете дізнатися, як PHP‑атрибути для моделей, нові налаштування черг і метод Cache::touch() вплинуть на вашу розробку?

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

Intervention Image: потужний інструмент для роботи з зображеннями у Laravel

Досліджуйте потужний пакет Intervention Image для PHP, який виводить редагування зображень на новий рівень з оновленою версією 3. Чи готові ви дізнатися, які нові можливості та функції чекають на вас у цьому інструменті

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

Використання штучного інтелекту для управління перекладами в Laravel

Досліджуйте нові можливості локалізації вашого Laravel-додатку з пакунками, які використовують штучний інтелект, такими як ChatGPT та Claude. Які рішення можуть спростити ваш процес перекладу та зробити його більш точним? Читайте далі, щоб дізнатися більше!