2

目标是允许将任何选项传递给 symfony CLI,而不是限制在一组已定义的允许选项。

例如:

php console.php --foo=bar

在这个例子中,foo是一个 symfony 应用程序没有明确允许的选项。

我的控制台应用程序正在代理到具有多个 CLI 选项的不同应用程序。我不想手动镜像每个可用选项以使它们可用于 symfony 应用程序。

4

2 回答 2

0

为什么不简单地创建你自己的控制台命令(参见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 是动态的,因此可以输入他喜欢的任何内容。

我没有测试这种方法,但我不明白为什么这不起作用。

于 2016-11-07T22:40:39.993 回答
0

我面临着类似的问题,我想出了一种不同的解决方案。尽管它在某种程度上很脏,但它允许用户发送选项,例如--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");

在我的应用程序中,我只需要捕获所有参数和选项并将其发送到另一个命令,这样就可以达到我的目的。

于 2022-02-27T00:44:31.380 回答