2016-03-03 56 views
2

給出該配置命令:關聯數組Symfony2的控制檯

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

回答

2

據我知道它使用命令選項時是不可能的(至少不會像你所描述...)。

最好的解決方法(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的值,同時保持默認值。