Выполните несколько команд консоли Symfony изнутри команды

У меня есть две команды, определенные в консольном приложении Symfony, clean-redis-keys а также clean-temp-files, Я хочу определить команду clean который выполняет эти две команды.

Как мне это сделать?

3

Решение

Смотрите документацию на Как вызвать другие команды:

Вызов команды от другого прост:

use Symfony\Component\Console\Input\ArrayInput;
// ...

protected function execute(InputInterface $input, OutputInterface $output)
{
$command = $this->getApplication()->find('demo:greet');

$arguments = array(
'command' => 'demo:greet',
'name'    => 'Fabien',
'--yell'  => true,
);

$greetInput = new ArrayInput($arguments);
$returnCode = $command->run($greetInput, $output);

// ...
}

Ты первый find() команда, которую вы хотите выполнить, передав имя команды. Затем вам нужно создать новый ArrayInput с аргументами и параметрами, которые вы хотите передать в команду.

В конце концов, вызывая run() Метод фактически выполняет команду и возвращает код, возвращенный из команды (возвращаемое значение из команды execute() метод).

4

Другие решения

Получите экземпляр приложения, найдите команды и выполните их:

protected function configure()
{
$this->setName('clean');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$app = $this->getApplication();

$cleanRedisKeysCmd = $app->find('clean-redis-keys');
$cleanRedisKeysInput = new ArrayInput([]);

$cleanTempFilesCmd = $app->find('clean-temp-files');
$cleanTempFilesInput = new ArrayInput([]);

// Note if "subcommand" returns an exit code, run() method will return it.
$cleanRedisKeysCmd->run($cleanRedisKeysInput, $output);
$cleanTempFilesCmd->run($cleanTempFilesInput, $output);
}

Чтобы избежать дублирования кода, вы можете создать универсальный метод для вызова подкоманды. Что-то вроде этого:

private function executeSubCommand(string $name, array $parameters, OutputInterface $output)
{
return $this->getApplication()
->find($name)
->run(new ArrayInput($parameters), $output);
}
2

По вопросам рекламы [email protected]