Консоль Artisan

Вступ

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 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, migrate:install, up та optimize. Якщо ви хочете дозволити більше команд, ви можете додати їх до масиву 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; однак, ви можете вибрати власне місце зберігання, доки ви вказуєте Laravel сканувати інші директорії для команд Artisan.

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

Щоб створити нову команду, ви можете скористатися командою 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')));
}
}

Для більшого повторного використання коду, гарною практикою є тримати ваші консольні команди легкими і дозволяти їм передавати виконання завдань сервісам застосунку. У наведеному вище прикладі зверніть увагу, що ми інжектуємо клас сервісу для виконання "важкої роботи" з відправки електронних листів.

Коди виходу

Якщо з методу handle нічого не повертається і команда виконується успішно, команда завершиться з кодом виходу 0, що вказує на успіх. Однак метод handle може за бажанням повернути ціле число, щоб вручну вказати код виходу команди:

$this->error('Щось пішло не так.');
 
return 1;

Якщо ви хочете "завалити" команду з будь-якого методу в межах команди, ви можете скористатися методом fail. Метод fail негайно припинить виконання команди і поверне код виходу 1:

$this->fail('Щось пішло не так.');

Команди Замикання

Команди на основі замикань надають альтернативу визначенню консольних команд як класів. Так само, як замикання маршрутів є альтернативою контролерам, розглядайте замикання команд як альтернативу класам команд.

Хоча файл routes/console.php не визначає HTTP-маршрути, він визначає консольні точки входу (маршрути) у ваш застосунок. У цьому файлі ви можете визначити всі ваші консольні команди на основі замикань, використовуючи метод Artisan::command. Метод command приймає два аргументи: сигнатуру команди і замикання, яке отримує аргументи та параметри команди:

Artisan::command('mail:send {user}', function (string $user) {
$this->info("Відправити email до: {$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');

Ізольовані команди

Щоб використовувати цю функцію, ваш застосунок повинен використовувати 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, що дозволить вам інтегрувати аргументи або параметри команди в ключ:

/**
 * Отримати ізольований 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 : ID Користувача}
{--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<string, string>
*/
protected function promptForMissingArgumentsUsing(): array
{
return [
'user' => 'Який ідентифікатор користувача повинен отримати лист?',
];
}

Ви також можете надати текст-заповнювач, використовуючи кортеж, що містить питання та заповнювач:

return [
'user' => ['Який ID користувача має отримати лист?', 'E.g. 123'],
];

Якщо ви хочете мати повний контроль над підказкою, ви можете надати замикання, яке повинно підказувати користувачу і повертати їхню відповідь:

use App\Models\User;
use function Laravel\Prompts\search;
 
// ...
 
return [
'user' => fn () => search(
label: 'Пошук користувача:',
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;
 
// ...
 
/**
* Виконати дії після того, як у користувача було запрошено відсутні аргументи.
*/
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();

Запит на введення даних

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

Крім відображення виводу, ви також можете попросити користувача надати вхідні дані під час виконання вашої команди. Метод ask запропонує користувачеві задане питання, прийме їх введення, а потім поверне введення користувача назад до вашої команди:

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

Метод ask також приймає необов'язковий другий аргумент, який вказує значення за замовчуванням, яке має бути повернене, якщо користувач не надасть введення:

$name = $this->ask('Як вас звати?', 'Taylor');

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

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

Запит підтвердження

Якщо вам потрібно попросити користувача про просте підтвердження "так або ні", ви можете використовувати метод confirm. За замовчуванням цей метод поверне false. Однак, якщо користувач введе y або yes у відповідь на запит, метод поверне true.

if ($this->confirm('Бажаєте продовжити?')) {
// ...
}

Якщо необхідно, ви можете вказати, що запит на підтвердження повинен повертати true за замовчуванням, передавши true як другий аргумент методу confirm:

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

Автозавершення

Метод anticipate може бути використаний для надання автозаповнення для можливих варіантів. Користувач все ще може надати будь-яку відповідь, незалежно від підказок автозаповнення:

$name = $this->anticipate('Як вас звати?', ['Taylor', 'Dayle']);

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

use App\Models\Address;
 
$name = $this->anticipate('Яка ваша адреса?', function (string $input) {
return Address::whereLike('name', "{$input}%")
->limit(5)
->pluck('name')
->all();
});

Питання з множинним вибором

Якщо вам потрібно надати користувачеві попередньо визначений набір варіантів при задаванні питання, ви можете використовувати метод choice. Ви можете встановити індекс масиву значення за замовчуванням, яке буде повернено, якщо жоден варіант не обрано, передавши індекс як третій аргумент методу:

$name = $this->choice(
'Як вас звати?',
['Taylor', 'Dayle'],
$defaultIndex
);

Крім того, метод choice приймає необов'язкові четвертий і п'ятий аргументи для визначення максимальної кількості спроб вибрати дійсну відповідь і чи дозволено кілька виборів:

$name = $this->choice(
'Як вас звати?',
['Taylor', 'Dayle'],
$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 автоматично розрахує відповідну ширину та висоту таблиці для вас:

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'
    ]);
 
    // ...
});

Альтернативно, ви можете передати всю Artisan команду до методу call у вигляді рядка:

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
});

Налаштування Заготовок

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