如何配置symfony/console
接受动态的选项列表?
那就是说 - 选项的名称在开发步骤中是未知的,因此我需要一个应用程序接受所有内容并使用标准$input->getOption
公开它。
任何机会轻松(没有在百万个地方黑客攻击组件)?
我的尝试包括扩展ArgvInput
和InputDefinition
类但由于各种原因(它们是客观的和symfony/console
组件实现特定的)而失败。简而言之:前者需要多次调用解析;后者 - 在多个地方实例化,所以我找不到合适的方法来注入它。
答案 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;
}
});
}
}