Команда Laravel випустила версію 13.16.0 із новою командою php artisan dev для запуску процесів розробки, хелпером для роботи з enum у запитах, методом withCookies() для всіх типів відповідей та драйвером режиму обслуговування на основі масивів для паралельного тестування.
Команда artisan dev
Головною новинкою релізу стала команда php artisan dev, яка одночасно запускає процеси розробки: сервер, обробник черг, відстеження логів та Vite. За замовчуванням її поведінка відповідає існуючому скрипту composer dev, але конфігурація переміщується з composer.json безпосередньо в код додатка.
Команди реєструються через клас DevCommands, зазвичай із сервіс-провайдера. Можна додавати як Artisan-команди, так і довільні shell-команди:
use Illuminate\Foundation\Console\DevCommands;
DevCommands::artisan('reverb:start');
DevCommands::register('stripe listen --forward-to ' . config('app.url'));
Необов'язковий другий аргумент задає ім'я процесу; якщо його не вказано, використовується перший сегмент до першого пробілу. Також можна призначити колір для кожного процесу:
DevCommands::artisan('reverb:start', 'reverb')->orange();
DevCommands::register('stripe listen --forward-to ' . config('app.url'))->green();
DevCommands запобігає автоматичній реєстрації команд пакетами з директорії vendor. Пакет все ще може надавати хелпер для реєстрації команд з вашого власного коду. PR також додає хелпер NodePackageManager, який визначає менеджер пакетів за наявними lockfile-файлами (npm, yarn, pnpm або bun), щоб загальна команда виконувалась правильним інструментом.
Примітка: рекомендується оновитися до v13.16.1, яка містить виправлення для реєстрації команди artisan dev.
Метод whenFilledEnum() для запитів
Трейт InteractsWithData отримав метод whenFilledEnum(), який перетворює значення запиту на backed enum перед викликом callback-функції. Раніше це вимагало виклику whenFilled(), потім tryFrom() та ручної перевірки на null:
$request->whenFilledEnum('status', Status::class, function (Status $status) use ($query): void {
$query->where('status', $status);
});
Callback виконується лише коли ключ заповнений, вказаний клас є backed enum, а значення успішно перетворюється на валідний case через tryFrom(). Невалідні значення пропускаються без викидання помилок. Опціональний другий callback виконується, коли основний не спрацював:
$request->whenFilledEnum('status', Status::class, function (Status $status) use ($query): void {
$query->where('status', $status);
}, function () use ($query): void {
$query->where('status', Status::Active);
});
Метод withCookies() для всіх відповідей
Метод withCookies() перемістився з RedirectResponse до ResponseTrait, тому тепер можна додавати кілька cookies до будь-якого типу відповіді, включно з JsonResponse та стандартними відповідями, одним викликом замість ланцюжка withCookie():
return response()->json($data)->withCookies([$cookieA, $cookieB, $cookieC]);
Зміна є адитивною та не порушує зворотну сумісність.
Драйвер array для режиму обслуговування
Новий драйвер режиму обслуговування на основі масивів доповнює існуючі file та cache драйвери. Він призначений для паралельного тестування, де файловий драйвер та мокінг фасаду Cache можуть заважати тестам, які викликають php artisan up та down.
Enum у методі broadcastAs()
Події broadcast тепер можуть повертати enum з методу broadcastAs() для імені події. У поєднанні з типізованим генератором SDK це забезпечує консистентність назв подій як на стороні відправника, так і отримувача, подібно до того, як атрибут #[Queue()] вже підтримує enum.
JSON Schema anyOf та безпечна десеріалізація
Компонент JsonSchema отримав підтримку anyOf, а десеріалізатор тепер захищений від необмеженого розширення $ref для запобігання нескінченній рекурсії.
Інші виправлення та покращення
Версія 13.16.0 також включає:
- Виправлено екранування shell-команд при запуску запланованих команд від імені іншого користувача
- Дозволено
RouteParameter використовувати ім'я параметра з атрибута
- Виправлено
Batchable::batching для завершених батчів
- Додано підтримку атрибутів черг у трейтах
- Посилено серіалізацію запитів HTTP-клієнта та фейкових відповідей
- Покращено типи повернення для скоупів моделей, callback-функцій з'єднань та хелперів передачі callback-функцій