Создание консольных команд

В этом разделе вы научитесь создавать свои собственные консольные команды, настраивать их и обрабатывать ввод.

Генерация команды

Создавать новые команды проще простого – используйте встроенную команду-генератор:

php imhotep make:command SendEmail
SHELL

После выполнения команды в 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
    }
}
PHP

Важно: Метод 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('Ошибка отправки.');
    }
});
PHP

Замыкание привязывается к базовому классу команды, поэтому вам доступны все те же полезные методы – $this->success(), $this->error(), $this->argument() и другие. Контейнер автоматически внедрит зависимости, которые вы укажете в параметрах.

Следующие шаги

Теперь, когда вы умеете создавать команды, изучите: