Создание консольных команд
В этом разделе вы научитесь создавать свои собственные консольные команды, настраивать их и обрабатывать ввод.
Генерация команды
Создавать новые команды проще простого – используйте встроенную команду-генератор:
php imhotep make:command SendEmail
После выполнения команды в app/Console/Commands/SendEmailCommand.php появится готовый класс-заготовка. Который расширяет Imhotep\Console\Command\Command и содержит три ключевых свойства:
$defaultName – как будет называться ваша команда (например, send:email)
$defaultDescription – краткое описание того, что делает команда
$signature – как именно пользователь должен передавать аргументы и опции
Сама логика пишется в методе handle. Всё, что нужно для работы, вы можете запросить через параметры метода – контейнер автоматически внедрит зависимости.
<?php declare(strict_types=1);
namespace App\Console\Commands;
use Imhotep\Console\Command\Command;
class SendEmailCommand extends Command
{
// Название команды – именно её будет вводить пользователь
public static string $defaultName = 'send:email';
// Краткое описание – появится в списке команд
public static string $defaultDescription = 'Отправляет письмо пользователю';
// Сигнатура – описывает, какие параметры принимает команда
protected string $signature = 'send:email {user} {--queue}';
/**
* Обработчик команды.
* Возвращает 0 при успехе, 1 при ошибке, 2 при некорректных входных данных.
*/
public function handle(Mailer $mailer): int
{
$user = $this->argument('user');
$useQueue = $this->hasOption('queue');
if (empty($user)) {
$this->error('Не указан пользователь');
return Command::INVALID;
}
if ($mailer->send($user, $useQueue)) {
$this->success("Письмо отправлено пользователю {$user}");
return Command::SUCCESS; // 0
}
$this->error("Не удалось отправить письмо");
return Command::FAILURE; // 1
}
}
Важно: Метод
handleдолжен возвращать код завершения: 0 – всё хорошо, 1 – произошла ошибка, 2 - некорректные входные данные. Это стандарт Unix, которому следуют все консольные программы.
Анонимные команды (через замыкания)
Не хотите создавать отдельный класс для простой команды? Воспользуйтесь анонимными командами в файле routes/console.php:
Console::command('mail:send {user}', function (Mailer $mailer, string $user) {
if ($mailer->send($user)) {
$this->success('Сообщение отправлено.');
} else {
$this->error('Ошибка отправки.');
}
});
Замыкание привязывается к базовому классу команды, поэтому вам доступны все те же полезные методы – $this->success(), $this->error(), $this->argument() и другие. Контейнер автоматически внедрит зависимости, которые вы укажете в параметрах.
Следующие шаги
Теперь, когда вы умеете создавать команды, изучите:
- Сигнатура команд – настраивайте аргументы и опции
- Ввод и вывод данных – получайте данные и выводите информацию
- Запуск команд – вызов команд из консоли
- Программный запуск команд – вызов команд из кода