允许传递给 Symfony CLI 的任何选项

Allow any option passed to Symfony CLI

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

例如:

php console.php --foo=bar

在此示例中,foo 是 symfony 应用程序未明确允许的选项。

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

为什么不简单地创建您自己的控制台命令(参见 Symfony doc 操作方法)并使用其输入选项或参数将其移交?

编辑

进一步阐明我的意思:不要使用自定义选项,而是使用自定义输入参数,例如:

$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 确实)

读取数组,将值拆分为“=”,然后按照要求的方式将它们交给您的第 3 方。由于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");

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