2013-10-24 240 views
0

我有一個用戶可配置的下拉列表,用戶可以用它們自己的選項列表填充它。我想用in:foo,bar驗證規則來驗證它。轉義Laravel驗證規則

不幸的是,這意味着有些人會選擇「是的,我願意」。如果我將下拉選項的分解列表傳遞給驗證規則,這顯然會打破驗證。

是否有可能擺脫Laravel的規則來避免這個問題?

+0

這是假設您是根據逗號爆,是否正確?你可以給他們一個textarea和內行換行字符嗎? (所以每行一個項目) – fideloper

+0

@fideloper因爲Laravel的'in'規則需要用逗號分隔的值列表,所以我會用逗號內插。 Textarea沒有幫助,因爲用戶仍然可以在其中一行中輸入逗號。 – ceejayoz

+0

爲什麼不在輸入驗證規則之前刪除任何逗號? – itachi

回答

8

Validator類利用PHP的str_getcsv()來解析規則的屬性。該過程進行是這樣的:使用|豎線分隔符(Validator::explodeRules()

    • 爆炸的所有規則爆炸規則的名稱,並使用:冒號分隔符(Validator::parseRule()
    • 通過str_getcsv()發送的屬性參數(Validator::parseParameters()

    這使您能夠像CSV文件一樣定義In:選項的列表 - 每列都有引號!例如:

    $input = ['foo' => 'Hello, world!']; 
    
    // Note the formatting of the `in:` options 
    $rules = ['foo' => 'required|in:"StackOverflow","Laravel","Hello, world!"',]; 
    
    $v = Validator::make($input, $rules); 
    
    var_dump($v->passes()); // true 
    

    另外,請記住,像大多數事情Laravel一樣,您可以以任何適合您的應用程序的方式擴展Validator類。如果你想要更強大的功能,就不需要堅持「庫存」即買即用的選擇。 :)

  • +0

    嗚呼!這很完美,謝謝。 – ceejayoz

    1

    正如Cryode在他的回答中所說,Laravel將允許的值解碼爲CSV。這裏有一個幫助方法可以用來從一個字符串數組中產生這個CSV編碼的字符串,而不用擔心手動轉義的東西。

    使用方法如下:

    $validator = new Validator(Input::all(), [ 
        'flavour' => [ 
         'required', 
         ValidatorHelper::inRule([ 
          "mint choc chip", 
          "rum and raisin", 
          "orange, peach and pineapple", 
         ]), 
        ], 
    ]);