目标是允许将任何选项传递给 symfony CLI,而不是限制在一组已定义的允许选项。
例如:
php console.php --foo=bar
在这个例子中,foo
是一个 symfony 应用程序没有明确允许的选项。
我的控制台应用程序正在代理到具有多个 CLI 选项的不同应用程序。我不想手动镜像每个可用选项以使它们可用于 symfony 应用程序。
目标是允许将任何选项传递给 symfony CLI,而不是限制在一组已定义的允许选项。
例如:
php console.php --foo=bar
在这个例子中,foo
是一个 symfony 应用程序没有明确允许的选项。
我的控制台应用程序正在代理到具有多个 CLI 选项的不同应用程序。我不想手动镜像每个可用选项以使它们可用于 symfony 应用程序。
为什么不简单地创建你自己的控制台命令(参见Symfony 文档如何做)并使用它的输入选项或参数来传递它?
编辑
为了进一步阐明我的意思:不要使用自定义选项,而是使用自定义输入参数,例如:
$this
// ...
->addArgument(
'options',
InputArgument::IS_ARRAY | InputArgument::REQUIRED,
'Please provide options separated by space'
);
让用户使用 mycompany:command opt1=val1 opt2=valx 之类的命令(而不是 mycompany:command --opt1=val1 --opt2=valx ,您必须为其定义 opt1 和 opt2 )
读取数组,将值拆分为 '=' 并按照需要将它们交给您的第三方。由于 opt1 和 opt2 是动态的,因此可以输入他喜欢的任何内容。
我没有测试这种方法,但我不明白为什么这不起作用。
我面临着类似的问题,我想出了一种不同的解决方案。尽管它在某种程度上很脏,但它允许用户发送选项,例如--opt1=val1
代替opt1=val1
.
::configure()
方法中,使用$this->ignoreValidationErrors();
. 这将阻止 Symfony 控制台验证用户的输入。::execute()
方法中,您可以使用array_slice($argv], 2)
. $argv
是一个全局变量,所以你需要先做一个global $argv
。global $argv;
$command = join(' ', array_slice($argv, 2));
// Pass the arguments and the options to the "echo" command.
passthru("echo $command");
在我的应用程序中,我只需要捕获所有参数和选项并将其发送到另一个命令,这样就可以达到我的目的。