允许传递给 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");
在我的应用程序中,我只需要捕获所有参数和选项并将其发送到另一个命令,所以它符合我的目的。
目标是允许将任何选项传递给 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");
在我的应用程序中,我只需要捕获所有参数和选项并将其发送到另一个命令,所以它符合我的目的。