Писал ли консольные скрипты для Symfony?

«Писал ли консольные скрипты для Symfony?» — вопрос из категории Symfony, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, регулярно создаю консольные команды в 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