问题
I have two commands defined in a Symfony console application, clean-redis-keys
and clean-temp-files
. I want to define a command clean
that executes these two commands.
How should I do this?
回答1:
See the documentation on How to Call Other Commands:
Calling a command from another one is straightforward:
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); // ... }
First, you
find()
the command you want to execute by passing the command name. Then, you need to create a newArrayInput
with the arguments and options you want to pass to the command.Eventually, calling the
run()
method actually executes the command and returns the returned code from the command (return value from command'sexecute()
method).
回答2:
Get the application instance, find the commands and execute them:
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);
}
To avoid code duplication, you can create generic method to call a subcommand. Something like this:
private function executeSubCommand(string $name, array $parameters, OutputInterface $output)
{
return $this->getApplication()
->find($name)
->run(new ArrayInput($parameters), $output);
}
来源:https://stackoverflow.com/questions/41319602/run-multiple-symfony-console-commands-from-within-a-command