Ответ
Да, регулярно создаю консольные команды в Symfony для различных задач: обработка данных, миграции, cron-задачи и утилиты администрирования.
Структура команды:
// src/Command/ProcessOrdersCommand.php
namespace AppCommand;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
use SymfonyComponentConsoleInputInputArgument;
use AppServiceOrderProcessor;
class ProcessOrdersCommand extends Command
{
protected static $defaultName = 'app:orders:process';
protected static $defaultDescription = 'Process pending orders';
private OrderProcessor $orderProcessor;
public function __construct(OrderProcessor $orderProcessor)
{
$this->orderProcessor = $orderProcessor;
parent::__construct();
}
protected function configure(): void
{
$this->addArgument('date', InputArgument::OPTIONAL, 'Process date (Y-m-d)', date('Y-m-d'));
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$date = $input->getArgument('date');
$output->writeln(sprintf('<info>Processing orders for %s</info>', $date));
$processed = $this->orderProcessor->processByDate($date);
$output->writeln(sprintf('<comment>Processed %d orders</comment>', $processed));
return Command::SUCCESS;
}
}
Ключевые особенности:
- Внедрение зависимостей — команды полноценные сервисы с DI
- Стили вывода —
<info>,<error>,<comment>для форматирования - Прогресс-бар —
ProgressBarдля длительных операций - Вопросы —
QuestionHelperдля интерактивного ввода - Тестирование —
CommandTesterдля юнит-тестов - Логирование — интеграция с Monolog через
LoggerAwareInterface