【问题标题】:Allow any option passed to Symfony CLI允许传递给 Symfony CLI 的任何选项
【发布时间】:2016-11-07 17:23:31
【问题描述】:

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

例如:

php console.php --foo=bar

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

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

【问题讨论】:

    标签: php symfony symfony-console


    【解决方案1】:

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

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

    【讨论】:

    • 我有自己的控制台命令。我不想让大约 30 个选项与代理应用程序保持同步。
    【解决方案2】:

    我遇到了类似的问题,我想出了另一种解决方案。虽然它在某种程度上很脏,但它允许用户发送 --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");
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2020-04-11
      相关资源
      最近更新 更多