给定此配置命令:

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/

10-10 10:44