1. Глубже в детали
  2. Консоль Artisan

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

Artisan - это интерфейс командной строки, включенный в Laravel. Artisan существует в корне вашего приложения как сценарий artisan и предоставляет ряд полезных команд, которые могут помочь вам при построении вашего приложения. Чтобы просмотреть список всех доступных команд 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, выполните команду 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 использует "белый список" для определения, какие команды Artisan разрешено выполнять в его оболочке. По умолчанию вы можете выполнять команды clear-compiled, down, env, inspire, migrate, optimize и up. Если вы хотите разрешить выполнение дополнительных команд, вы можете добавить их в массив commands в вашем файле конфигурации tinker.php:

'commands' => [
// App\Console\Commands\ExampleCommand::class,
],

Классы, Которые Не Должны Быть Псевдонимами

Обычно Tinker автоматически создает псевдонимы классов по мере взаимодействия с ними в Tinker. Однако вы можете захотеть никогда не создавать псевдонимы для некоторых классов. Вы можете сделать это, добавив эти классы в массив dont_alias вашего файла конфигурации tinker.php:

'dont_alias' => [
App\Models\User::class,
],

Создание Команд

Помимо команд, предоставляемых Artisan, вы можете создавать собственные пользовательские команды. Команды обычно хранятся в каталоге app/Console/Commands; однако вы вольны выбрать свое собственное место хранения, пока ваши команды могут быть загружены Composer.

Генерация Команд

Для создания новой команды вы можете использовать команду Artisan make:command. Эта команда создаст новый класс команды в каталоге app/Console/Commands. Не беспокойтесь, если этот каталог не существует в вашем приложении - он будет создан при первом запуске команды Artisan make:command:

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 = 'Отправить маркетинговое письмо пользователю';
 
/**
* Выполнение консольной команды.
*/
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("Отправка электронной почты пользователю: {$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('Отправить маркетинговое письмо пользователю');

Изолированные Команды

Внимание Для использования этой функции ваше приложение должно использовать драйвер кэша 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

ID Блокировки

По умолчанию Laravel будет использовать имя команды для создания строкового ключа, который используется для получения атомарного замка в кэше вашего приложения. Однако вы можете настроить этот ключ, определив метод isolatableId в вашем классе Artisan-команды, что позволит вам интегрировать аргументы или опции команды в ключ:

/**
* Получение изоляционного ID для команды.
*/
public function isolatableId(): string
{
return $this->argument('user');
}

Время Истечения Блокировки

По умолчанию изоляционные замки истекают после завершения выполнения команды. Или, если выполнение команды прерывается и она не может завершиться, замок истечет через час. Однако вы можете настроить время истечения блокировки, определив метод isolationLockExpiresAt в вашей команде:

use DateTimeInterface;
use DateInterval;
 
/**
* Определение времени истечения изоляционного блока для команды.
*/
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}';

В этом примере можно указать переключатель --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 : Идентификатор пользователя}
{--queue : Следует ли поставить задачу в очередь}';

Запрос отсутствующего ввода

Если ваша команда содержит обязательные аргументы, пользователь получит сообщение об ошибке, когда они не будут предоставлены. В качестве альтернативы вы можете настроить вашу команду на автоматический запрос пользователя, когда отсутствуют обязательные аргументы, реализовав интерфейс 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
*/
protected function promptForMissingArgumentsUsing()
{
return [
'user' => 'Какой идентификатор пользователя должен получить почту?',
];
}

Вы также можете предоставить текст-заполнитель, используя кортеж, содержащий вопрос и заполнитель:

return [
'user' => ['Какой идентификатор пользователя должен получить почту?', 'Например, 123'],
];

Если вам нужен полный контроль над запросом, вы можете предоставить замыкание, которое должно задать вопрос пользователю и вернуть его ответ:

use App\Models\User;
use function Laravel\Prompts\search;
 
// ...
 
return [
'user' => fn () => search(
label: 'Поиск пользователя:',
placeholder: 'Например, Тейлор Отвелл',
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: 'Хотели бы вы поставить письмо в очередь?',
default: $this->option('queue')
));
}

Команды I/O

Получение Ввода

Во время выполнения вашей команды вам, вероятно, потребуется получить доступ к значениям аргументов и опций, принимаемых вашей командой. Для этого вы можете использовать методы argument и option. Если аргумента или опции не существует, будет возвращено null:

/**
* Выполнение консольной команды.
*/
public function handle(): void
{
$userId = $this->argument('user');
}

Если вам нужно получить все аргументы в виде array, вызовите метод arguments:

$arguments = $this->arguments();

Опции могут быть получены так же легко, как и аргументы, используя метод option. Чтобы получить все опции в виде array, вызовите метод options:

// Получение определенной опции...
$queueName = $this->option('queue');
 
// Получение всех опций в виде массива...
$options = $this->options();

Запрос Ввода

Примечание Laravel Prompts - это PHP-пакет для добавления красивых и удобных в использовании форм ваших консольных приложений с функциями, подобными браузеру, включая текст-плейсхолдеры и валидацию.

Помимо отображения вывода, вы также можете попросить пользователя предоставить ввод во время выполнения вашей команды. Метод ask запросит пользователя с заданным вопросом, примет их ввод, а затем вернет ввод пользователя обратно в вашу команду:

/**
* Выполнение консольной команды.
*/
public function handle(): void
{
$name = $this->ask('Как вас зовут?');
 
// ...
}

Метод secret аналогичен методу ask, но ввод пользователя не будет виден им при вводе в консоль. Этот метод полезен, когда запрашивается чувствительная информация, такая как пароли:

$password = $this->secret('Какой пароль?');

Запрос Подтверждения

Если вам нужно попросить пользователя подтвердить "да" или "нет", вы можете использовать метод confirm. По умолчанию этот метод вернет false. Однако, если пользователь введет y или yes в ответ на запрос, метод вернет true.

if ($this->confirm('Желаете продолжить?')) {
// ...
}

При необходимости вы можете указать, что подтверждение по умолчанию должно возвращать true, передав true вторым аргументом методу confirm:

if ($this->confirm('Желаете продолжить?', true)) {
// ...
}

Автозаполнение

Метод anticipate можно использовать для предоставления автозавершения для возможных вариантов. Пользователь все равно может предоставить любой ответ, независимо от подсказок автозавершения:

$name = $this->anticipate('Как вас зовут?', ['Тейлор', 'Дейл']);

Кроме того, вы можете передать замыкание в качестве второго аргумента метода anticipate. Замыкание будет вызвано каждый раз, когда пользователь вводит символ. Замыкание должно принимать параметр строку, содержащую ввод пользователя на данный момент, и возвращать массив вариантов для автозавершения:

$name = $this->anticipate('Какой ваш адрес?', function (string $input) {
// Возврат опций автозаполнения...
});

Вопросы с Множественным Выбором

Если вам нужно предоставить пользователю предопределенный набор вариантов при задании вопроса, вы можете использовать метод choice. Вы можете установить индекс массива значения по умолчанию для возврата, если ни один вариант не выбран, передав индекс в качестве третьего аргумента методу:

$name = $this->choice(
'Как вас зовут?',
['Тейлор', 'Дейл'],
$defaultIndex
);

Кроме того, метод choice принимает дополнительные четвертый и пятый аргументы для определения максимального количества попыток выбора допустимого ответа и разрешения множественного выбора:

$name = $this->choice(
'Как вас зовут?',
['Тейлор', 'Дейл'],
$defaultIndex,
$maxAttempts = null,
$allowMultipleSelections = false
);

Запись Вывода

Для отправки вывода в консоль вы можете использовать методы line, info, comment, question, warn и error. Каждый из этих методов будет использовать соответствующие цвета ANSI для своих целей. Например, давайте отобразим некоторую общую информацию пользователю. Обычно метод info будет отображаться в консоли как текст зеленого цвета:

/**
* Выполнение консольной команды.
*/
public function handle(): void
{
// ...
 
$this->info('Команда выполнена успешно!');
}

Для отображения сообщения об ошибке используйте метод error. Текст сообщения об ошибке обычно отображается красным цветом:

$this->error('Что-то пошло не так!');

Вы можете использовать метод line для отображения простого, неокрашенного текста:

$this->line('Отобразить на экране');

Вы можете использовать метод newLine для отображения пустой строки:

// Запись одной пустой строки...
$this->newLine();
 
// Запись трех пустых строк...
$this->newLine(3);

Таблицы

Метод table упрощает правильное форматирование нескольких строк/столбцов данных. Вам нужно всего лишь предоставить имена столбцов и данные для таблицы, и Laravel автоматически рассчитает соответствующую ширину и высоту таблицы для вас: Метод table упрощает правильное форматирование нескольких строк/столбцов данных. Вам нужно всего лишь предоставить имена столбцов и данные для таблицы, и Laravel автоматически рассчитает соответствующую ширину и высоту таблицы для вас:

use App\Models\User;
 
$this->table(
['Имя', 'Электронный адрес}'],
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.

Регистрация Команд

Все ваши команды консоли зарегистрированы в классе 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'
]);
 
// ...
});

Кроме того, вы можете передать целую команду Artisan методу 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
});

Настройка Шаблона

Команды консоли Artisan make используются для создания различных классов, таких как контроллеры, задачи, миграции и тесты. Эти классы создаются с использованием файлов-заготовок ("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 отправляется после завершения выполнения команды.