symfony / console组件的可变数量选项

时间:2014-02-18 22:31:59

标签: php symfony

如何配置symfony/console接受动态的选项列表?

那就是说 - 选项的名称在开发步骤中是未知的,因此我需要一个应用程序接受所有内容并使用标准$input->getOption公开它。

任何机会轻松(没有在百万个地方黑客攻击组件)?

我的尝试包括扩展ArgvInputInputDefinition类但由于各种原因(它们是客观的和symfony/console组件实现特定的)而失败。简而言之:前者需要多次调用解析;后者 - 在多个地方实例化,所以我找不到合适的方法来注入它。

3 个答案:

答案 0 :(得分:4)

您可以创建自己的ArgvInput,它将允许所有选项。

例如,您可以看到稍微修改过的ArgvInput here

版本

我只修改了行:178

并注释出这些界限:188-199

然后将您的ArgvInput版本的实例传递给

而不是默认版本
$input = new AcceptAllArgvInput();    
$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run($input);

答案 1 :(得分:2)

我过去使用IS_ARRAY选项完成了这项工作。这对您的实例也不起作用吗?

->addArgument('routeParams', InputArgument::IS_ARRAY, "Required Placeholders for route");

我的用例是用于特殊身份验证系统的自定义URL生成器。我需要一种生成测试URL的方法。当然,每条路径都有不同数量的必需参数,我希望避免将参数作为CSV字符串传递。

命令示例:      用法:myGenerateToken用户路由[variables1] ... [variablesN]

 php app/console myGenerateToken 1 productHomePage
 php app/console myGenerateToken 1 getProduct 1
 php app/console myGenerateToken 1 getProductFile 1 changelog

变量作为数组

传递给“routeParams”中的命令
 $params = $input->getArgument('routeParams');
 var_dump($params);

 array(2) {
   [0] =>
   string(1) "1"
   [1] =>
   string(9) "changelog"
 }

我注意到还有一个名为InputOption::VALUE_IS_ARRAY的“选项”版本,但我没有成功让它发挥作用。参数版本InputArgument::IS_ARRAY似乎表现为一个选项,因为如果没有指定参数,它就不会出错。

编辑:

作者的问题是寻求“如何在运行时定义变量命令行选项”,其中我的答案是“如何为预定义的选项/参数提供多个值”

答案 2 :(得分:1)

以下是如何使用symfony / console ^ 3.0在PHP 7+上实现它:

abstract class CommandWithDynamicOptions extends Command {

    /** @var array The list of dynamic options passed to the command */
    protected $dynamicOptions = [];

  /**
   * @inheritdoc
   */
  protected function configure() {
    $this->setName('custom:command');

    $this->setDefinition(new class($this->getDefinition(), $this->dynamicOptions) extends InputDefinition {
      protected $dynamicOptions = [];

      public function __construct(InputDefinition $definition, array &$dynamicOptions) {
        parent::__construct();
        $this->setArguments($definition->getArguments());
        $this->setOptions($definition->getOptions());
        $this->dynamicOptions =& $dynamicOptions;
      }

      public function getOption($name) {
        if (!parent::hasOption($name)) {
          $this->addOption(new InputOption($name, null, InputOption::VALUE_OPTIONAL));
          $this->dynamicOptions[] = $name;
        }
        return parent::getOption($name);
      }

      public function hasOption($name) {
        return TRUE;
      }

    });
  }
}