2016-01-18 52 views
2

我正在玩symfony控制檯包,我正在執行該命令時詢問一個值,也就是public function execute(...)Symfony控制檯「詢問」將不會接受空值

當試圖向用戶詢問某件事情時,我發現如果不製作自己的自定義樣式,它有兩種不同的方法。 a)使用問題助手,b)使用預定義的樣式,特此SymfonyStyle
我開始使用SymfonyStyle運行一個簡單的ask("question here"),並且如果我沒有給它賦值,它會一直給我錯誤。如果我使用幫手,直接創建問題,那麼它會允許我給它一個空值。

下面是一些例子:

# SomeCommand.php 
namespace What\A\Command; 

use Symfony\Component\Console\Question\Question; 
use Symfony\Component\Console\Style\SymfonyStyle; 

// ... 
public function execute(InputInterface $input, OutputInterface $output) 
{ 
    // ... 

    // With the helper, which allows empty answer 
    $helper = $this->getHelper('question'); 
    $q = new Question('Question here'); 

    dump($helper->ask($input, $output, $q)); 
    // Output: 
    // Question here 
    // null 


    // With SymfonyStyle which DOES NOT allow empty answer 
    $io = new SymfonyStyle($input, $output); 
    dump($io->ask("Question here")); 
    // Output: 
    // Question here: 
    // [ERROR] A value is required. 
} 

展望的SymfonyStyle文件,它看起來像它並沒有做太多的不同與驗證所有的,因爲該類說,這只是造型。 那麼有什麼我缺少這是兩者之間的區別?是否有可能使SymfonyStyle完全接受空答案?

+1

是的,與SymfonyStyle輸入似乎是強制性的,而不是使用默認值。檢查SymfonyQuestionHelper類 – Matteo

+0

啊,沒有注意到它沒有直接使用Question類,謝謝指導我。我發現'SymfonyQuestionHelper'需要一個有效的值。現在我知道如何繼續讓它變成空的,但也保持相同的風格而不會破壞乾燥:)謝謝,@Matteo! – Morten

+0

嗨@Morten歡迎您! – Matteo

回答

0

這是我在這種情況下使用的: (這是一個類的摘錄,其中$this->io= new SymfonyStyle($input, $output))。

在我的用例中佔位符將在用戶輸入中的情況是不太可能的。

public function askAllowEmpty($question, $default) 
    { 
     $placeholder = \uniqid("placeholder"); 
     $field = $this->io->ask($question, $default, function($string) use ($placeholder) { 
       return (null == $string)? $placeholder : $string; 
     }); 
     return str_replace($placeholder, null, $field); 
    } 
0

我的解決方案:

$question = new Question(
    "Please insert a value", 
    false 
); 

$userInput = $io->askQuestion($question); 


$finalValue = $userInput ? $userInput : null; 

需要的最後一行實際上使(而不是false$finalValue作爲null當用戶不插入任何東西。