Как контролировать статус выполнения консольной команды в Symfony?

В Symfony есть несколько способов контролировать статус выполнения консольной команды.

1. Использование встроенного класса Process: Symfony предоставляет класс Process, который позволяет запускать консольные команды из вашего кода. Чтобы контролировать статус выполнения команды, вы можете использовать методы Process, такие как isSuccessful(), getExitCode() и getExitCodeText(). Например:

use SymfonyComponentProcessProcess;

$command = new Process(['ls', '-l']);
$command->run();

if ($command->isSuccessful()) {
    echo 'Команда успешно выполнена';
} else {
    echo 'Возникла ошибка при выполнении команды';
    echo $command->getErrorOutput();
}

2. Обработка исключений: Если консольная команда завершается с ошибкой, Symfony может сгенерировать исключение CommandFailedException. Чтобы перехватить и обработать это исключение, вы можете использовать блок try-catch. Например:

use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleExceptionCommandFailedException;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;

class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        try {
            // Ваш код для выполнения команды
        } catch (CommandFailedException $exception) {
            $output->writeln('<error>Возникла ошибка при выполнении команды</error>');
            $output->writeln($exception->getMessage());
        }
    }
}

3. Использование встроенных событий команды: Symfony также предоставляет механизм событий для управления и контроля выполнения команд. Вы можете подписаться на событие Command::TERMINATE, которое будет вызываться после завершения выполнения команды. Например:

use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleEventConsoleTerminateEvent;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
use SymfonyComponentEventDispatcherEventSubscriberInterface;

class MySubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            Command::TERMINATE => 'onTerminate',
        ];
    }

    public function onTerminate(ConsoleTerminateEvent $event)
    {
        $input = $event->getInput();
        $output = $event->getOutput();

        if ($event->getExitCode() === 0) {
            $output->writeln('Команда успешно выполнена');
        } else {
            $output->writeln('Возникла ошибка при выполнении команды');
        }
    }
}

// Регистрация слушателя событий
$command = new MyCommand();
$command->getEventDispatcher()->addSubscriber(new MySubscriber());

Это лишь несколько способов контролирования статуса выполнения консольной команды в Symfony. Однако в реальных проектах может быть еще больше вариантов и инструментов, в зависимости от ваших потребностей и настроек приложения.