Консоль Artisan
11.x
.
Почему это важно?
- Введение
- Tinker (REPL)
- Написание команд
- Генерация команд
- Структура команды
- Анонимные команды
- Изолированные команды
- Определение вводимых данных
- Аргументы
- Параметры
- Массивы данных
- Описания вводимых данных
- Запрос отсутствующего ввода
- Ввод/вывод команды
- Получение входных данных
- Запрос для ввода данных
- Вывод данных
- Регистрация команд
- Программное выполнение команд
- Вызов команд из других команд
- Обработка сигналов
- Настройка заготовок команд (stubs)
- События
Введение
Artisan – это интерфейс командной строки, входящий в состав Laravel. Он предлагает ряд полезных команд, которые помогут при создании приложения. Для просмотра списка всех доступных команд Artisan можно использовать команду list
:
php artisan list
Каждая команда также включает в себя экран «справки», который отображает и описывает доступные аргументы и параметры команды. Чтобы просмотреть экран справки, используйте help
перед именем команды:
php artisan help migrate
Laravel Sail
Если вы используете Laravel Sail в качестве локальной среды разработки, не забудьте использовать командную строку sail
для вызова команд Artisan. 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, задачи, события и многое другое. Чтобы войти в среду Tinker, выполните команду tinker
Artisan:
php artisan tinker
Вы можете опубликовать конфигурационный файл Tinker с помощью команды vendor:publish
:
php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
Глобальный помощник
dispatch
и методdispatch
классаDispatchable
зависят от “garbage collection” для помещения задания в очередь. Следовательно, при использовании Tinker вы должны использоватьBus::dispatch
илиQueue::push
для отправки заданий.
Список разрешенных команд
Tinker использует список «разрешенных» команд, которые разрешено запускать Artisan в её среде. По умолчанию вы можете запускать команды clear-compiled
, down
, env
, inspire
, migrate
, optimize
и up
. Для добавления в этот список больше команд, добавьте их в массив commands
конфигурационного файла config/tinker.php
:
'commands' => [
// App\Console\Commands\ExampleCommand::class,
],
Черный список псевдонимов
Как правило, Tinker автоматически создает псевдонимы классов, когда вы взаимодействуете с ними в Tinker. Тем не менее вы можете запретить такое поведение для некоторых классов, перечислив их в массиве dont_alias
конфигурационного файла config/tinker.php
:
'dont_alias' => [
App\Models\User::class,
],
Написание команд
В дополнение к командам Artisan, вы можете создавать пользовательские команды. Команды обычно хранятся в каталоге app/Console/Commands
; однако вы можете выбрать другое месторасположение, если эти команды могут быть загружены менеджером Composer.
Генерация команд
Чтобы сгенерировать новую команду, используйте команду make:command
Artisan. Эта команда поместит новый класс команды в каталог app/Console/Commands
вашего приложения. Если этот каталог не существует в вашем приложении, то Laravel предварительно создаст его:
php artisan make:command SendEmails
Структура команды
После создания команды следует заполнить свойства класса $signature
и $description
. Эти свойства будут отображаться на экране при использовании команды list
. Свойство $signature
также позволяет определять вводимые данные. Метод handle
будет вызываться при выполнении команды. Вы можете разместить логику команды в этом методе.
Давайте рассмотрим пример команды. Обратите внимание, что мы можем запросить любые необходимые зависимости в методе handle
команды. Контейнер служб Laravel автоматически внедрит все зависимости, типы которых объявлены в этом методе:
<?php
namespace App\Console\Commands;
use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Command;
class SendEmails extends Command
{
/**
* Имя и сигнатура консольной команды.
*
* @var string
*/
protected $signature = 'mail:send {user}';
/**
* Описание консольной команды.
*
* @var string
*/
protected $description = 'Send a marketing email to a user';
/**
* Выполнить консольную команду.
*/
public function handle(DripEmailer $drip): void
{
$drip->send(User::find($this->argument('user')));
}
}
Хорошей практикой повторного использования кода считается создание «простых» консольных команд с делегированием своих задач службам приложения. В приведенном примере мы внедряем класс службы для выполнения «затратной» отправки электронных писем.
Анонимные команды
Анонимные команды обеспечивают альтернативу определению консольных команд в виде классов. Точно так же, как замыкания маршрутов являются альтернативой контроллерам. В рамках метода commands
файла app/Console/Kernel.php
Laravel загружает файл routes/console.php
:
/**
* Зарегистрировать команды, основанные на анонимных функциях.
*/
protected function commands(): void
{
require base_path('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;
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');
Изолированные команды
Для использования этой функции ваше приложение должно использовать
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 гарантирует, что никакие другие экземпляры этой команды в данный момент не выполняются. Laravel достигает этого, пытаясь получить блокировку с использованием кэш-драйвера по умолчанию вашего приложения. Если другие экземпляры команды выполняются, команда не будет выполнена; однако команда все равно завершится с кодом успешного завершения:
php artisan mail:send 1 --isolated
Если вы хотите указать код статуса завершения, который команда должна вернуть, если она не может выполниться, вы можете предоставить его с помощью опции isolated
:
php artisan mail:send 1 --isolated=12
Идентификатор блокировки (Lock ID)
По умолчанию Laravel использует имя команды для генерации строкового ключа, который используется для получения блокировки в кэше вашего приложения. Однако вы можете настроить этот ключ, определив метод isolatableId
в вашем классе команды Artisan, что позволяет вам интегрировать аргументы или опции команды в ключ:
/**
* Get the isolatable ID for the command.
*/
public function isolatableId(): string
{
return $this->argument('user');
}
Срок действия блокировки
По умолчанию изоляционные блокировки истекают после завершения команды. Или, если команда прервана и не может быть завершена, срок действия блокировки истечет через один час. Однако вы можете настроить время действия блокировки, определив метод isolationLockExpiresAt
в вашей команде:
use DateTimeInterface;
use DateInterval;
/**
* Determine when an isolation lock expires for the command.
*/
public function isolationLockExpiresAt(): DateTimeInterface|DateInterval
{
return now()->addMinutes(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}';
В этом примере при вызове команды Artisan может быть указан переключатель --queue
. Если переключатель --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
, возвращающий массив вопросов с ключами соответствующими именам аргументов:
/**
* Prompt for missing input arguments using the returned questions.
*
* @return array
*/
protected function promptForMissingArgumentsUsing()
{
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::where('name', 'like', "%{$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;
// ...
/**
* Выполнить действия после запроса пользователя относительно отсутствующих аргументов
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return void
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
$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');
//
}
Если вам нужно получить все аргументы в виде массива, вызовите метод arguments
:
$arguments = $this->arguments();
Параметры могут быть получены так же легко, как и аргументы, используя метод option
. Чтобы получить все параметры в виде массива, вызовите метод options
:
// Получение определенного параметра ...
$queueName = $this->option('queue');
// Получение всех параметров в виде массива ...
$options = $this->options();
Запрос для ввода данных
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?');
Запрос подтверждения
Если вам нужно получить от пользователя простое подтверждение «yes or no», то вы можете использовать метод confirm
. По умолчанию этот метод возвращает значение false
. Однако, если пользователь вводит y
или yes
в ответ на запрос, то метод возвращает 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
. Замыкание будет вызываться каждый раз, когда пользователь вводит символ. Замыкание должно принимать строковый параметр, содержащий введенные пользователем данные, и возвращать массив вариантов для автозавершения:
$name = $this->anticipate('What is your address?', function (string $input) {
// Вернуть варианты для автоматического завершения ...
});
Вопросы с множественным выбором
Если нужно предоставить пользователю предопределенный набор вариантов для выбора при задании вопроса, то используйте метод 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
, info
, comment
, question
, warn
и 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.
Регистрация команд
Все ваши консольные команды должны быть зарегистрированы в классе App\Console\Kernel
, который является «ядром консоли» вашего приложения. Внутри метода commands
этого класса вы увидите вызов метода load
ядра. Метод load
просканирует каталог app/Console/Commands
и автоматически зарегистрирует каждую содержащуюся в нем команду в Artisan. Фактически, вы можете делать дополнительные вызовы метода load
для сканирования других каталогов на наличие команд Artisan:
/**
* Зарегистрировать команды приложения.
*/
protected function commands(): void
{
$this->load(__DIR__.'/Commands');
$this->load(__DIR__.'/../Domain/Orders/Commands');
// ...
}
Вы можете самостоятельно зарегистрировать команды, добавив название класса команды в свойство $commands
класса App\Console\Kernel
. Если это свойство еще не определено в вашем ядре, вы должны определить его вручную. При загрузке Artisan, все команды, перечисленные в этом свойстве будут доступны в контейнере служб и зарегистрированы в Artisan:
protected $commands = [
Commands\SendEmails::class
];
Программное выполнение команд
По желанию можно выполнить команду Artisan за пределами CLI. Например, вы можете запустить команду Artisan в маршруте или контроллере. Для этого можно использовать метод call
фасада Artisan
. Метод call
принимает в качестве первого аргумента либо имя сигнатуры команды, либо имя класса, а в качестве второго – массив параметров команды. Будет возвращен код выхода / возврата:
use Illuminate\Support\Facades\Artisan;
Route::post('/user/{user}/mail', function (string $user) {
$exitCode = Artisan::call('mail:send', [
'user' => $user, '--queue' => 'default'
]);
//...
});
Кроме того, вы можете передать методу call
команду полностью в виде строки:
Artisan::call('mail:send 1 --queue=default');
Передача массива значений
Если ваша команда определяет параметр, который принимает массив, то вы можете передать массив значений этому параметру:
use Illuminate\Support\Facades\Artisan;
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;
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
});
Настройка заготовок команд (stubs)
Команды make
консоли Artisan используются для создания различных классов, таких как контроллеры, задания, миграции и тесты. Эти классы создаются с помощью файлов «заготовок», которые заполняются значениями на основе ваших входных данных. Однако, иногда может потребоваться внести небольшие изменения в файлы, создаваемые с помощью 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
выполняется после завершения команды.