Консоль Artisan · Laravel
Вступ
Artisan - це інтерфейс командного рядка, який входить до складу Laravel. Artisan живе в корені вашого застосунку як скрипт artisan і надає низку корисних команд, що допомагають під час розробки. Щоб побачити список усіх доступних команд Artisan, скористайтеся командою list:
php artisan list
Кожна команда також має екран довідки, який показує та описує доступні аргументи й опції команди. Щоб побачити довідку, поставте перед назвою команди help:
php artisan help migrate
Laravel Sail
Якщо ви використовуєте Laravel Sail як локальне середовище розробки, не забувайте викликати команди Artisan через командний рядок sail. Sail виконає ваші команди Artisan усередині Docker-контейнерів застосунку:
./vendor/bin/sail artisan list
Tinker (REPL)
Laravel Tinker - це потужний REPL для фреймворка Laravel, побудований на пакеті PsySH.
Встановлення
Усі застосунки Laravel містять Tinker за замовчуванням. Проте ви можете встановити Tinker через Composer, якщо раніше видалили його зі свого застосунку:
composer require laravel/tinker
Примітка Шукаєте гаряче перезавантаження, багаторядкове редагування коду й автодоповнення під час роботи з вашим застосунком Laravel? Погляньте на Tinkerwell!
Використання
Tinker дозволяє взаємодіяти з усім застосунком Laravel у командному рядку, включно з моделями Eloquent, завданнями (jobs), подіями та іншим. Щоб увійти в середовище Tinker, запустіть команду Artisan tinker:
php artisan tinker
Опублікувати файл конфігурації Tinker можна командою vendor:publish:
php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
Попередження Хелпер-функція
dispatchі методdispatchкласуDispatchableзалежать від збирача сміття, який ставить завдання в чергу. Тому в Tinker для відправлення завдань слід використовуватиBus::dispatchабоQueue::push.
Список дозволених команд
Tinker використовує «allow»-список, щоб визначити, які команди Artisan можна запускати в його оболонці. За замовчуванням доступні команди clear-compiled, down, env, inspire, migrate, migrate:install, up та optimize. Якщо хочете дозволити більше команд, додайте їх до масиву commands у файлі конфігурації tinker.php:
'commands' => [
// App\Console\Commands\ExampleCommand::class,
],
Класи, для яких не потрібні псевдоніми
Зазвичай Tinker автоматично створює псевдоніми класів, коли ви з ними працюєте. Проте для деяких класів псевдоніми можуть бути непотрібні. Це досягається переліченням класів у масиві dont_alias файлу конфігурації tinker.php:
'dont_alias' => [
App\Models\User::class,
],
Написання команд
Крім команд, які постачаються з Artisan, ви можете створювати власні. Команди зазвичай зберігаються в каталозі app/Console/Commands; проте ви вільні обрати власне місце зберігання, доки вказуєте Laravel сканувати інші каталоги на наявність команд Artisan.
Генерація команд
Щоб створити нову команду, скористайтеся командою Artisan make:command. Вона створить новий клас команди в каталозі app/Console/Commands. Не хвилюйтеся, якщо цього каталогу у вашому застосунку немає - він буде створений під час першого запуску команди make:command:
php artisan make:command SendEmails
Структура команди
Після генерації команди слід визначити її сигнатуру та опис за допомогою атрибутів Signature і Description. Атрибут Signature також дозволяє описати очікуваний ввід команди. Метод handle викликається під час виконання команди. Логіку команди можна розміщувати саме в ньому.
Погляньмо на приклад команди. Зверніть увагу, що будь-які потрібні залежності можна запросити через метод handle. Контейнер сервісів Laravel автоматично впровадить усі залежності, типи яких вказані в сигнатурі цього методу:
<?php
namespace App\Console\Commands;
use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Attributes\Description;
use Illuminate\Console\Attributes\Signature;
use Illuminate\Console\Command;
#[Signature('mail:send {user}')]
#[Description('Send a marketing email to a user')]
class SendEmails extends Command
{
/**
* Виконати консольну команду.
*/
public function handle(DripEmailer $drip): void
{
$drip->send(User::find($this->argument('user')));
}
}
Примітка Для кращого повторного використання коду добре тримати консольні команди легкими й делегувати виконання задач сервісам застосунку. У прикладі вище ми впроваджуємо клас сервісу, який робить «важку роботу» з надсилання листів.
Коди виходу
Якщо метод handle нічого не повертає, а команда виконалася успішно, вона завершиться з кодом виходу 0, що означає успіх. Проте метод handle може за потреби повернути ціле число, щоб вказати код виходу вручну:
$this->error('Something went wrong.');
return 1;
Якщо ви хочете «провалити» команду з будь-якого її методу, скористайтеся методом fail. Метод fail негайно припиняє виконання команди й повертає код виходу 1:
$this->fail('Something went wrong.');
Команди на замиканнях
Команди на основі замикань - це альтернатива опису консольних команд у вигляді класів. Так само, як замикання маршрутів є альтернативою контролерам, замикання команд можна вважати альтернативою класам команд.
Хоч файл routes/console.php не описує HTTP-маршрути, він визначає консольні точки входу (маршрути) у ваш застосунок. У цьому файлі можна описати всі команди на замиканнях за допомогою методу Artisan::command. Метод command приймає два аргументи: сигнатуру команди і замикання, яке отримує аргументи та опції команди:
Artisan::command('mail:send {user}', function (string $user) {
$this->info("Sending email to: {$user}!");
});
Замикання привʼязане до примірника команди, тому ви маєте повний доступ до всіх допоміжних методів, доступних у повноцінному класі команди.
Типізація залежностей
Крім аргументів та опцій команди, замикання команд можуть вказувати типи додаткових залежностей, які треба отримати з контейнера сервісів:
use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Support\Facades\Artisan;
Artisan::command('mail:send {user}', function (DripEmailer $drip, string $user) {
$drip->send(User::find($user));
});
Описи команд на замиканнях
Коли описуєте команду на замиканні, скористайтеся методом purpose, щоб додати опис до команди. Цей опис буде показано під час запуску php artisan list або php artisan help:
Artisan::command('mail:send {user}', function (string $user) {
// ...
})->purpose('Send a marketing email to a user');
Isolatable-команди
Попередження Щоб скористатися цією можливістю, застосунок має використовувати драйвер кешу
memcached,redis,dynamodb,database,fileабоarrayяк типовий драйвер кешу. Крім того, усі сервери повинні спілкуватися з тим самим центральним сервером кешу.
Іноді потрібно гарантувати, що одночасно виконується лише один примірник команди. Для цього реалізуйте в класі команди інтерфейс Illuminate\Contracts\Console\Isolatable:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Isolatable;
class SendEmails extends Command implements Isolatable
{
// ...
}
Коли ви позначаєте команду як Isolatable, Laravel автоматично робить доступною для неї опцію --isolated, і описувати її в опціях команди не потрібно. Коли команду викликано з цією опцією, Laravel перевірить, що інші примірники цієї команди ще не запущені. Досягається це спробою отримати атомарне блокування через типовий драйвер кешу застосунку. Якщо інші примірники команди виконуються, команда не запуститься; проте вона все одно завершиться з успішним кодом виходу:
php artisan mail:send 1 --isolated
Якщо ви хочете вказати код виходу, який команда має повернути, коли вона не може виконатися, передайте потрібний код через опцію isolated:
php artisan mail:send 1 --isolated=12
Ідентифікатор блокування
За замовчуванням Laravel використовує назву команди для формування рядкового ключа, за яким отримується атомарне блокування в кеші застосунку. Проте ви можете налаштувати цей ключ, визначивши метод isolatableId у класі команди Artisan, що дозволить включити в ключ аргументи або опції команди:
/**
* Отримати isolatable ID для команди.
*/
public function isolatableId(): string
{
return $this->argument('user');
}
Час дії блокування
За замовчуванням блокування ізоляції знімається після завершення команди. Або, якщо команду перервано і вона не змогла завершитися, блокування спаде за годину. Проте ви можете змінити час дії блокування, визначивши в команді метод isolationLockExpiresAt:
use DateTimeInterface;
use DateInterval;
/**
* Визначити, коли спадає блокування ізоляції для команди.
*/
public function isolationLockExpiresAt(): DateTimeInterface|DateInterval
{
return now()->plus(minutes: 5);
}
Опис очікуваного вводу
Під час написання консольних команд часто потрібно збирати ввід від користувача через аргументи або опції. Laravel дає дуже зручний спосіб описати очікуваний ввід за допомогою властивості signature у ваших командах. Властивість signature дозволяє описати назву, аргументи та опції команди в єдиному виразному синтаксисі, схожому на маршрути.
Аргументи
Усі аргументи та опції, які надає користувач, беруться у фігурні дужки. У наступному прикладі команда описує один обовʼязковий аргумент: user:
/**
* Назва та сигнатура консольної команди.
*
* @var string
*/
protected $signature = 'mail:send {user}';
Аргументи можна робити необовʼязковими або задавати для них значення за замовчуванням:
// Необовʼязковий аргумент...
'mail:send {user?}'
// Необовʼязковий аргумент зі значенням за замовчуванням...
'mail:send {user=foo}'
Опції
Опції, як і аргументи, - ще одна форма вводу від користувача. Опції мають префікс із двох дефісів (--), коли їх передають у командному рядку. Є два типи опцій: ті, що отримують значення, і ті, що ні. Опції без значення працюють як булевий «перемикач». Погляньмо на приклад такої опції:
/**
* Назва та сигнатура консольної команди.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue}';
У цьому прикладі перемикач --queue можна вказати під час виклику команди Artisan. Якщо перемикач --queue передано, значення опції буде true. Інакше значення буде false:
php artisan mail:send 1 --queue
Опції зі значеннями
Далі погляньмо на опцію, яка очікує значення. Якщо користувач має вказати значення для опції, додайте до назви опції знак =:
/**
* Назва та сигнатура консольної команди.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue=}';
У цьому прикладі користувач може передати значення для опції так. Якщо опцію не вказано під час виклику команди, її значенням буде null:
php artisan mail:send 1 --queue=default
Значення за замовчуванням для опцій задаються вказуванням значення після назви опції. Якщо користувач не передав значення опції, буде використано значення за замовчуванням:
'mail:send {user} {--queue=default}'
Скорочення опцій
Щоб задати скорочення під час опису опції, вкажіть його перед назвою опції й використайте символ | як розділювач між скороченням і повною назвою опції:
'mail:send {user} {--Q|queue=}'
Під час виклику команди в терміналі скорочення опцій мають мати префікс з одного дефіса, а символ = під час вказування значення опції не використовується:
php artisan mail:send 1 -Qdefault
Масиви у вводі
Якщо ви хочете описати аргументи або опції, які очікують кілька значень, скористайтеся символом *. Спершу погляньмо на приклад такого аргументу:
'mail:send {user*}'
Під час запуску цієї команди аргументи user можна передавати по порядку в командному рядку. Наприклад, наступна команда задасть значення user як масив зі значеннями 1 та 2:
php artisan mail:send 1 2
Символ * можна поєднувати з описом необовʼязкового аргументу, щоб дозволити нуль або більше входжень аргументу:
'mail:send {user?*}'
Масиви опцій
Коли описуєте опцію, яка очікує кілька значень, кожне значення опції, переданої команді, має мати префікс із назви опції:
'mail:send {--id=*}'
Таку команду можна викликати, передавши кілька аргументів --id:
php artisan mail:send --id=1 --id=2
Описи вводу
Описи для аргументів та опцій вводу задаються відокремленням назви аргументу від опису двокрапкою. Якщо для опису команди потрібно трохи більше місця, спокійно розбивайте визначення на кілька рядків:
/**
* Назва та сигнатура консольної команди.
*
* @var string
*/
protected $signature = 'mail:send
{user : The ID of the user}
{--queue : Whether the job should be queued}';
Запит відсутнього вводу
Якщо ваша команда містить обовʼязкові аргументи, користувач отримає повідомлення про помилку, коли їх не передано. Як варіант, можна налаштувати команду, щоб вона автоматично запитувала користувача, коли обовʼязкових аргументів немає, реалізувавши інтерфейс PromptsForMissingInput:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;
class SendEmails extends Command implements PromptsForMissingInput
{
/**
* Назва та сигнатура консольної команди.
*
* @var string
*/
protected $signature = 'mail:send {user}';
// ...
}
Якщо Laravel потрібно отримати від користувача обовʼязковий аргумент, він автоматично спитає про нього, розумно сформулювавши питання за назвою або описом аргументу. Якщо ви хочете змінити питання, яким збирається обовʼязковий аргумент, реалізуйте метод promptForMissingArgumentsUsing, повернувши масив питань із ключами за назвами аргументів:
/**
* Запитати відсутні аргументи вводу за допомогою повернутих питань.
*
* @return array<string, string>
*/
protected function promptForMissingArgumentsUsing(): array
{
return [
'user' => 'Which user ID should receive the mail?',
];
}
Ви також можете надати текст-заповнювач, використавши кортеж із питання та заповнювача:
return [
'user' => ['Which user ID should receive the mail?', 'E.g. 123'],
];
Якщо вам потрібен повний контроль над запитом, передайте замикання, яке має запитати користувача й повернути його відповідь:
use App\Models\User;
use function Laravel\Prompts\search;
// ...
return [
'user' => fn () => search(
label: 'Search for a user:',
placeholder: 'E.g. Taylor Otwell',
options: fn ($value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: []
),
];
Примітка Докладна документація Laravel Prompts містить додаткову інформацію про доступні запити та їхнє використання.
Якщо ви хочете запитати користувача вибрати або ввести опції, включіть запити в метод handle команди. Проте якщо потрібно запитувати користувача лише тоді, коли його вже автоматично запитали про відсутні аргументи, реалізуйте метод afterPromptingForMissingArguments:
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use function Laravel\Prompts\confirm;
// ...
/**
* Виконати дії після того, як користувача запитали про відсутні аргументи.
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void
{
$input->setOption('queue', confirm(
label: 'Would you like to queue the mail?',
default: $this->option('queue')
));
}
Ввід і вивід команди
Отримання вводу
Під час виконання команди вам, найімовірніше, знадобиться доступ до значень аргументів та опцій, які вона приймає. Для цього скористайтеся методами argument і option. Якщо аргументу або опції не існує, буде повернено null:
/**
* Виконати консольну команду.
*/
public function handle(): void
{
$userId = $this->argument('user');
}
Якщо потрібно отримати всі аргументи як array, викличте метод arguments:
$arguments = $this->arguments();
Опції отримуються так само просто, як аргументи, - методом option. Щоб отримати всі опції як масив, викличте метод options:
// Отримати конкретну опцію...
$queueName = $this->option('queue');
// Отримати всі опції як масив...
$options = $this->options();
Метод input дозволяє отримати аргументи й опції команди як примірник Illuminate\Console\CommandInput, який надає ті самі типізовані аксесори, що доступні для HTTP-запитів та інших контейнерів даних:
use App\Enums\ReportType;
/**
* Виконати консольну команду.
*/
public function handle(): void
{
$input = $this->input()->date('from');
// ...
}
Метод input також можна використати, щоб отримати одне значення вводу з аргументів або опцій:
$queue = $this->input('queue', 'default');
Запит вводу в користувача
Примітка Laravel Prompts - це PHP-пакет для додавання гарних і зручних форм до ваших консольних застосунків, із можливостями на кшталт браузерних, включно з текстом-заповнювачем і валідацією.
Крім виведення інформації, ви також можете просити користувача надати ввід під час виконання команди. Метод ask покаже користувачеві задане питання, прийме його ввід і поверне його у вашу команду:
/**
* Виконати консольну команду.
*/
public function handle(): void
{
$name = $this->ask('What is your name?');
// ...
}
Метод ask також приймає необовʼязковий другий аргумент, який задає значення за замовчуванням, що повертається, якщо користувач нічого не ввів:
$name = $this->ask('What is your name?', 'Taylor');
Метод secret схожий на ask, але ввід користувача не буде видимим під час набору в консолі. Цей метод корисний, коли ви запитуєте чутливу інформацію на кшталт паролів:
$password = $this->secret('What is the password?');
Запит підтвердження
Якщо потрібно спитати користувача про просте підтвердження «так або ні», скористайтеся методом confirm. За замовчуванням цей метод повертає false. Проте якщо користувач введе у відповідь y або yes, метод повернe true.
if ($this->confirm('Do you wish to continue?')) {
// ...
}
За потреби можна вказати, що запит підтвердження має повертати true за замовчуванням, передавши true другим аргументом методу confirm:
if ($this->confirm('Do you wish to continue?', true)) {
// ...
}
Автодоповнення
Метод anticipate можна використати для автодоповнення можливих варіантів. Користувач усе одно може дати будь-яку відповідь, незалежно від підказок автодоповнення:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
Як альтернативу, другим аргументом методу anticipate можна передати замикання. Замикання викликатиметься кожного разу, коли користувач вводить символ. Воно має приймати рядковий параметр із поточним вводом користувача й повертати масив варіантів для автодоповнення:
use App\Models\Address;
$name = $this->anticipate('What is your address?', function (string $input) {
return Address::whereLike('name', "{$input}%")
->limit(5)
->pluck('name')
->all();
});
Питання з кількома варіантами
Якщо потрібно дати користувачеві наперед визначений набір варіантів під час питання, скористайтеся методом choice. Ви можете задати індекс масиву для значення за замовчуванням, яке повернеться, якщо жодного варіанта не вибрано, передавши індекс третім аргументом методу:
$name = $this->choice(
'What is your name?',
['Taylor', 'Dayle'],
$defaultIndex
);
Крім того, метод choice приймає необовʼязкові четвертий і пʼятий аргументи, які визначають максимальну кількість спроб вибрати допустиму відповідь і чи дозволено кілька варіантів вибору:
$name = $this->choice(
'What is your name?',
['Taylor', 'Dayle'],
$defaultIndex,
$maxAttempts = null,
$allowMultipleSelections = false
);
Вивід
Щоб надіслати вивід у консоль, скористайтеся методами line, newLine, info, comment, question, warn, alert та error. Кожен із цих методів використовує відповідні ANSI-кольори для свого призначення. Наприклад, покажімо користувачеві якусь загальну інформацію. Зазвичай метод info виводить у консоль текст зеленого кольору:
/**
* Виконати консольну команду.
*/
public function handle(): void
{
// ...
$this->info('The command was successful!');
}
Щоб показати повідомлення про помилку, використайте метод error. Текст повідомлення про помилку зазвичай відображається червоним:
$this->error('Something went wrong!');
Метод line виводить звичайний текст без кольору:
$this->line('Display this on the screen');
Метод newLine виводить порожній рядок:
// Вивести один порожній рядок...
$this->newLine();
// Вивести три порожні рядки...
$this->newLine(3);
Таблиці
Метод table дає змогу легко й правильно форматувати кілька рядків / стовпців даних. Вам потрібно лише передати назви стовпців і дані таблиці, а Laravel автоматично обчислить відповідні ширину й висоту таблиці:
use App\Models\User;
$this->table(
['Name', 'Email'],
User::all(['name', 'email'])->toArray()
);
Індикатори прогресу
Для тривалих задач буває корисно показати індикатор прогресу, який повідомляє користувачам, наскільки задача виконана. За допомогою методу withProgressBar Laravel покаже індикатор прогресу й посуватиме його на кожній ітерації по заданому ітерованому значенню:
use App\Models\User;
$users = $this->withProgressBar(User::all(), function (User $user) {
$this->performTask($user);
});
Іноді потрібен більш ручний контроль над тим, як посувається індикатор прогресу. Спершу визначте загальну кількість кроків, які пройде процес. Потім посувайте індикатор після обробки кожного елемента:
$users = App\Models\User::all();
$bar = $this->output->createProgressBar(count($users));
$bar->start();
foreach ($users as $user) {
$this->performTask($user);
$bar->advance();
}
$bar->finish();
Примітка Більш розширені опції описані в документації компонента Symfony Progress Bar.
Реєстрація команд
За замовчуванням Laravel автоматично реєструє всі команди в каталозі app/Console/Commands. Проте ви можете вказати Laravel сканувати інші каталоги на наявність команд Artisan за допомогою методу withCommands у файлі bootstrap/app.php вашого застосунку:
->withCommands([
__DIR__.'/../app/Domain/Orders/Commands',
])
За потреби команди можна реєструвати й вручну, передавши назву класу команди методу withCommands:
use App\Domain\Orders\Commands\SendEmails;
->withCommands([
SendEmails::class,
])
Коли Artisan завантажується, усі команди вашого застосунку будуть розвʼязані контейнером сервісів і зареєстровані в Artisan.
Програмний запуск команд
Іноді потрібно виконати команду Artisan за межами CLI. Наприклад, ви можете захотіти виконати команду Artisan з маршруту або контролера. Для цього скористайтеся методом call фасаду Artisan. Метод call приймає першим аргументом або назву сигнатури команди, або назву класу, а другим - масив параметрів команди. Буде повернено код виходу:
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;
Route::post('/user/{user}/mail', function (string $user) {
$exitCode = Artisan::call('mail:send', [
'user' => $user, '--queue' => 'default'
]);
// ...
});
Як альтернативу, можна передати методу call цілу команду Artisan у вигляді рядка:
Artisan::call('mail:send 1 --queue=default');
Передавання значень-масивів
Якщо ваша команда описує опцію, яка приймає масив, ви можете передати цій опції масив значень:
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;
Route::post('/mail', function () {
$exitCode = Artisan::call('mail:send', [
'--id' => [5, 13]
]);
});
Передавання булевих значень
Якщо потрібно вказати значення опції, яка не приймає рядкових значень, як-от прапорець --force команди migrate:refresh, передайте true або false як значення опції:
$exitCode = Artisan::call('migrate:refresh', [
'--force' => true,
]);
Постановка команд Artisan у чергу
За допомогою методу queue фасаду Artisan команди Artisan можна навіть ставити в чергу, щоб вони обробляли обробники черги у фоні. Перед використанням цього методу переконайтеся, що ви налаштували чергу й запустили слухач черги:
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;
Route::post('/user/{user}/mail', function (string $user) {
Artisan::queue('mail:send', [
'user' => $user, '--queue' => 'default'
]);
// ...
});
Методи onConnection і onQueue дозволяють вказати підключення або чергу, до якої слід відправити команду Artisan:
Artisan::queue('mail:send', [
'user' => 1, '--queue' => 'default'
])->onConnection('redis')->onQueue('commands');
Виклик команд з інших команд
Іноді потрібно викликати інші команди з наявної команди Artisan. Це робиться методом call. Цей метод call приймає назву команди й масив аргументів / опцій команди:
/**
* Виконати консольну команду.
*/
public function handle(): void
{
$this->call('mail:send', [
'user' => 1, '--queue' => 'default'
]);
// ...
}
Якщо ви хочете викликати іншу консольну команду й приглушити весь її вивід, скористайтеся методом callSilently. Метод callSilently має таку саму сигнатуру, як call:
$this->callSilently('mail:send', [
'user' => 1, '--queue' => 'default'
]);
Обробка сигналів
Як ви, можливо, знаєте, операційні системи дозволяють надсилати сигнали до запущених процесів. Наприклад, сигнал SIGTERM - це спосіб, яким операційні системи просять програму завершитися коректно. Якщо ви хочете слухати сигнали у ваших консольних командах Artisan і виконувати код, коли вони надходять, скористайтеся методом trap:
/**
* Виконати консольну команду.
*/
public function handle(): void
{
$this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false);
while ($this->shouldKeepRunning) {
// ...
}
}
Щоб слухати кілька сигналів одночасно, передайте методу trap масив сигналів:
$this->trap([SIGTERM, SIGQUIT], function (int $signal) {
$this->shouldKeepRunning = false;
dump($signal); // SIGTERM / SIGQUIT
});
Команда dev
Команда Artisan dev запускає всі процеси, потрібні для локальної розробки, в одному вікні терміналу. За замовчуванням вона паралельно запускає сервер розробки PHP, обробник черги, відслідковування логів через Pail і компіляцію ресурсів Vite:
php artisan dev
Під капотом команда dev використовує npm-пакет @laravel/multiplex для керування процесами, даючи кожному процесу власну вкладку з виводом, у якому можна шукати та прокручувати. Кожен процес підписаний і має свій колір, тому їх легко відрізнити. Якщо процес падає, він перезапуститься автоматично, а коли ви виходите, увесь вивід записується назад у термінал, тому нічого не втрачається.
Примітка Команда
devвимагає Node 22.13 або новішої версії. На Windows вона переходить на npm-пакетconcurrently, і інтерфейс із вкладками недоступний.
Процеси за замовчуванням:
| Назва | Команда |
|---|---|
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 |
Примітка Процес
viteавтоматично визначає ваш менеджер пакетів Node (npm, pnpm, Yarn або Bun) і використовує відповідну команду запуску.
Налаштування dev-процесів
Процеси, які запускає команда dev, налаштовуються за допомогою класу DevCommands, зазвичай у методі boot вашого AppServiceProvider. Метод register приймає рядок команди й необовʼязкову назву:
use Illuminate\Foundation\DevCommands;
/**
* Завантажити будь-які сервіси застосунку.
*/
public function boot(): void
{
DevCommands::register('some-command --flag', 'my-process');
}
Реєструючи команду Artisan, можна скористатися методом artisan, який автоматично додає до команди префікс php artisan:
DevCommands::artisan('horizon', 'horizon');
Так само метод node додає до команди префікс команди запуску вашого визначеного менеджера пакетів (наприклад, npm run), а метод nodeExec - префікс команди exec менеджера пакетів (наприклад, npx):
DevCommands::node('storybook', 'storybook');
DevCommands::nodeExec('tailwindcss -i resources/css/app.css -o public/css/app.css --watch', 'tailwind');
Якщо ви реєструєте процес з тією ж назвою, що й процес за замовчуванням, ваш процес замінить типовий. Наприклад, можна налаштувати процес server на інший порт:
DevCommands::artisan('serve --host=localhost --port=9000', 'server');
Ви також можете налаштувати колір підпису процесу у вашому терміналі. Доступні методи кольорів: blue, purple, pink, orange, green та yellow. Крім того, методу color можна передати власний hex-колір:
DevCommands::register('my-command', 'my-process')->green();
DevCommands::register('my-command', 'my-process')->color('#ff6347');
Щоб побачити всі зареєстровані dev-процеси без їхнього запуску, скористайтеся командою dev:list:
php artisan dev:list
Перезапуск процесів, що впали
Якщо процес падає, Laravel перезапустить його після короткої затримки, до пʼяти разів, перед тим як позначити його як невдалий. Процес, який помирає протягом секунди після запуску, не перезапускається, бо він, найімовірніше, взагалі не запустився успішно. Ручний перезапуск процесу через r скидає лічильник.
Ви можете вимкнути цю поведінку для одного запуску за допомогою опції --no-restart:
php artisan dev --no-restart
Або вимкнути її для всього застосунку методом disableAutoRestart:
DevCommands::disableAutoRestart();
Фільтрація dev-процесів
Ви можете вказати команді dev запускати лише певні процеси за допомогою методу only. Так само можна виключити певні процеси методом except:
// Запустити лише процеси server і vite...
DevCommands::only('server', 'vite');
// Запустити всі процеси, крім обробника черги...
DevCommands::except('queue');
Виключити команди, зареєстровані пакетами, або типові команди Laravel можна методами withoutVendorCommands і withoutDefaultCommands:
DevCommands::withoutVendorCommands();
DevCommands::withoutDefaultCommands();
Налаштування заготовок
Команди make консолі Artisan створюють різноманітні класи: контролери, завдання (jobs), міграції та тести. Ці класи генеруються з файлів-заготовок («stub»), які заповнюються значеннями на основі вашого вводу. Проте вам може знадобитися внести невеликі зміни у файли, які генерує Artisan. Для цього скористайтеся командою stub:publish, щоб опублікувати найпоширеніші заготовки у ваш застосунок і налаштувати їх:
php artisan stub:publish
Опубліковані заготовки лежатимуть у каталозі stubs у корені вашого застосунку. Будь-які зміни, які ви внесете в ці заготовки, відобразяться під час генерації відповідних класів командами make Artisan.
Події
Artisan відправляє три події під час запуску команд: Illuminate\Console\Events\ArtisanStarting, Illuminate\Console\Events\CommandStarting і Illuminate\Console\Events\CommandFinished. Подія ArtisanStarting відправляється відразу, коли Artisan починає роботу. Далі подія CommandStarting відправляється безпосередньо перед запуском команди. Нарешті, подія CommandFinished відправляється після того, як команда завершила виконання.
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.