Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Консольные команды

Консольная команда — код приложения, который запускают из терминала, а не из браузера: очистить старые записи, разослать письма, показать статистику. Такие команды обычно выполняет планировщик задач сервера. В Laminas для них есть пакет laminas-cli, построенный на компоненте Symfony Console.

Установка

composer require laminas/laminas-cli

В проекте появится программа vendor/bin/laminas. Список доступных команд показывает:

vendor/bin/laminas list

Класс команды

Команды модуля кладут в module/<Модуль>/src/Command. Создайте папку и файл вручную:

// module/Blog/src/Command/HelloCommand.php
namespace Blog\Command;
 
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
class HelloCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln('Блог работает.');
 
        return Command::SUCCESS;
    }
}

Метод execute() — тело команды. $output->writeln() печатает строку в терминал, а возвращаемое значение сообщает, успешно ли завершилась команда.

Регистрация

Команду описывают в двух разделах module/Blog/config/module.config.php: имя — в laminas-cli, способ создания — в service_manager:

// module/Blog/config/module.config.php
'laminas-cli' => [
    'commands' => [
        'blog:hello' => Command\HelloCommand::class,
    ],
],
'service_manager' => [
    'factories' => [
        Command\HelloCommand::class => InvokableFactory::class,
    ],
],

Ключ blog:hello — имя, под которым команду вызывают. Принято начинать его с имени модуля.

Запуск

vendor/bin/laminas blog:hello

Терминал напечатает «Блог работает.».

Команда с сервисом и аргументом

Команда получает сервисы через конструктор, как контроллер. Аргументы командной строки описывают в методе configure():

// module/Blog/src/Command/LatestPostsCommand.php
namespace Blog\Command;
 
use Blog\Model\PostTable;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
class LatestPostsCommand extends Command
{
    public function __construct(private PostTable $posts)
    {
        parent::__construct();
    }
 
    protected function configure(): void
    {
        $this->setDescription('Показывает последние статьи');
        $this->addArgument('limit', InputArgument::OPTIONAL, 'Сколько статей показать', 5);
    }
 
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $limit = (int) $input->getArgument('limit');
 
        foreach ($this->posts->fetchLatest($limit) as $post) {
            $output->writeln($post->id . ': ' . $post->title);
        }
 
        return Command::SUCCESS;
    }
}

Зарегистрируйте её под именем blog:latest с фабрикой ReflectionBasedAbstractFactory::class. Команда vendor/bin/laminas blog:latest 3 напечатает три последние статьи, а без числа — пять.

МетодДля чего
setDescription()Описание в списке команд
addArgument()Значение по порядку: blog:latest 3
addOption()Именованный параметр: --format=json
$input->getArgument(), $input->getOption()Чтение значений

Частая ошибка

Если в конструкторе команды с зависимостями забыть parent::__construct();, команда не инициализируется, и при запуске появится ошибка о том, что у неё нет имени или определения. Конструктор родителя вызывают всегда — после него выполняется configure().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.