我的控制台命令有两个选项(不是参数)。
这是我的命令代码
class crawlerCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('top:crawler')
->setDescription('Greet someone')
->addOption('opt1', null, InputOption::VALUE_REQUIRED, 'option1')
->addOption('opt2',null, InputOption::VALUE_OPTIONAL, 'option2');
然后我试图从Controller调用命令
例如我想从Controller
执行此控制台命令$ app/console top:crawler --opt1=s --opt2=2
因此我制作了这段代码。
public function indexAction(){
$command = $this->get('crawlerCommandService');
$inputDefinition = new InputDefinition(array(
new InputOption('opt1', 's', InputOption::VALUE_OPTIONAL),
new InputOption('opt2', '2', InputOption::VALUE_OPTIONAL),
));
$input = new ArgvInput(array('argv' => 'app'));
$input->bind($inputDefinition);
$output = new ConsoleOutput();
$returnCode = $command->run($input, $output);
然而它不起作用。
请提供一些提示。
我可以使用ArrayInput而不是ArgvInput解决问题。
我在这里写下代码。
$command = $this->get('crawlerCommandService');
$output = new ConsoleOutput();
$arguments = array(
'--opt1' => 's',
'--opt2' => '2'
);
$input = new ArrayInput($arguments);
$returnCode = $command->run($input, $output);
答案 0 :(得分:1)
在构造函数中传递的数组的第一个元素是正在运行的应用程序的名称,如documentation
中所述查看代码,如果手动构建代码,可以将任何内容作为第一个元素传递。
$input = new ArgvInput(array(
'app' => 'something', 'arg1' => 'val1', 'arg2' => 'val2'
));