Laravel 13 представив нову команду artisan dev, яка стандартизує всі інструменти, необхідні для роботи над проєктом: сервер розробки, воркер черг, виведення логів, Vite та інше. До недавнього часу skeleton-додаток об'єднував їх через скрипт dev у composer.json, який запускав чотири команди через npx concurrently.
Заміна composer-скрипта на artisan-команду
Laravel 13.16 замінив це рішення на офіційну команду:
php artisan dev
Скрипт composer dev все ще існує в skeleton-шаблоні, але тепер він лише викликає php artisan dev. Список процесів перенесено в PHP, де ви можете реєструвати власні процеси через клас DevCommands.
Стандартні процеси
За замовчуванням команда запускає чотири процеси:
- server:
php artisan serve --host=localhost
- queue:
php artisan queue:listen --tries=1 --timeout=0
- logs:
php artisan pail --timeout=0
- vite:
npm run dev
Процес Pail реєструється лише за наявності функції pcntl_fork, тому користувачі Windows отримують три інші процеси. Процес vite автоматично визначає менеджер пакетів за lockfile у проєкті (npm, pnpm, Yarn або Bun), тому в pnpm-проєкті він запустить pnpm run dev без додаткових налаштувань.
Під капотом команда все ще використовує concurrently, а з версії 13.18 передає прапорець --kill-others-on-fail. Це означає, що збій одного процесу зупиняє всі інші, замість того щоб залишати напівробочий стек.
Реєстрація власних процесів
Стандартні налаштування підходять для нового проєкту, але більшість додатків швидко виходять за їхні межі. Розгляньмо додаток, який використовує Horizon замість queue:listen, транслює події через Reverb, приймає Stripe-вебхуки локально через Stripe CLI та перевіряє типи TypeScript у режимі watch.
Все це можна зареєструвати в методі boot вашого AppServiceProvider:
namespace App\Providers;
use Illuminate\Foundation\DevCommands;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
if (! $this->app->environment('local')) {
return;
}
DevCommands::artisan('horizon', 'queue');
DevCommands::artisan('reverb:start --debug', 'reverb')->purple();
DevCommands::register(
'stripe listen --forward-to '.config('app.url').'/stripe/webhook',
'stripe'
)->orange();
DevCommands::nodeExec('tsc --noEmit --watch --preserveWatchOutput', 'types')->yellow();
}
}
Методи реєстрації
Для реєстрації процесів доступні чотири методи:
- artisan(): додає префікс
php artisan до команди
- node(): додає префікс команди запуску виявленого менеджера пакетів
- nodeExec(): використовує команду exec (
npx та аналоги)
- register(): приймає сирий shell-команду для будь-чого іншого, як Stripe CLI вище
Другий аргумент - це ім'я процесу, що відображається в терміналі. Якщо його опустити, ім'ям стає перше слово команди (horizon, reverb:start, stripe).
Заміна стандартних процесів
Ім'я є ідентифікатором процесу, тому повторне використання імені дозволяє замінити або переналаштувати стандартний процес. У прикладі вище реєстрація процесу з іменем queue замінює стандартний queue:listen воркер на Horizon.
Порядок реєстрації не має значення. Команди, зареєстровані у вашому додатку, завжди мають перевагу над стандартними від фреймворку, а обидва типи мають перевагу над командами з vendor. Це означає, що встановлений пакет не може непомітно перехопити процес, який ви визначили. Пакети надають метод, який ви викликаєте самостійно, замість автоматичного підключення під час виявлення.
Налаштування кольорів
Кольори необов'язкові. Кожен процес автоматично отримує окремий колір, і ви використовуєте методи blue(), purple(), pink(), orange(), green(), yellow() або color('#ff6347') лише коли хочете, щоб конкретний процес виділявся.
Перегляд та фільтрація списку
Щоб побачити зареєстровані процеси без їх запуску, виконайте php artisan dev:list (додано в версії 13.17). Команда виводить кожен процес, його команду та файл із номером рядка, де його зареєстровано - корисно, коли інструкції пакета додали щось, про що ви забули.
Ви також можете обмежити список без видалення реєстрацій:
// Запустити лише server та vite...
DevCommands::only('server', 'vite');
// Запустити все, крім queue воркера...
DevCommands::except('queue');
Обидва методи є фільтрами, що застосовуються під час виконання, тому процес, виключений через except(), все ще відображається у вашому provider і може бути повернутий видаленням одного рядка.
Автор та документація
Команду dev додав Joe Tannenbaum у Pull Request #60412. Повні деталі доступні в офіційній документації Artisan для Laravel 13.x.