Консольные команды
Консольная команда — код приложения, который запускают из терминала, а не из браузера: очистить старые записи, разослать письма, показать статистику. Такие команды обычно выполняет планировщик задач сервера. В 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().