给定此配置命令:
protected function configure() {
$this->setName('command:test')
->addOption("service", null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, "What services are desired ?", array(
"s1" => true,
"s2" => true,
"s3" => true,
"s4" => false,
"s5" => true,
"s6" => true,
"s7" => true,
"s8" => true,
"s9" => true
))
}
现在调用命令时,如何传递关联数组。
#!/bin/bash
php app/console command:test --service s1:true --service s2:false --s3:true
条件:
我不想为这个命令创建9+选项。
理想情况下,我希望在通过新服务时保留默认值。
全部,如果可能的话,在命令定义内。这不是支持代码。否
if
最佳答案
据我所知,使用命令选项是不可能的(至少不像您描述的那样…)。
最好的解决方法(imo)是使用命令参数(而不是命令选项)和编写额外的代码(不是,虽然可能,但将所有额外的代码放在命令定义中并不好)。
可能是这样的:
class TestCommand extends ContainerAwareCommand
{
protected function getDefaultServicesSettings()
{
return [
's1' => true,
's2' => true,
's3' => true,
's4' => false,
's5' => true,
's6' => true,
's7' => true,
's8' => true,
's9' => true
];
}
private function normalizeServicesValues($values)
{
if (!$values) {
return $this->getDefaultServicesSettings();
}
$new = [];
foreach ($values as $item) {
list($service, $value) = explode(':', $item);
$new[$service] = $value == 'true' ? true : false;
}
return array_merge($this->getDefaultServicesSettings(), $new);
}
protected function configure()
{
$this
->setName('commant:test')
->addArgument(
'services',
InputArgument::IS_ARRAY|InputArgument::OPTIONAL,
'What services are desired ?');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$services = $this->normalizeServicesValues(
$input->getArgument('services'));
// ...
}
}
那么
$ bin/console commant:test s1:false s9:false
在保持默认值的同时覆盖s1和s2值。
关于php - 关联数组symfony2控制台,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35784079/