簡體   English   中英

逃避Laravel驗證規則

[英]escaping Laravel validation rules

我有一個用戶可配置的下拉列表,用戶可以在其中使用自己的選項列表進行填充。 我想使用in:foo,bar的驗證規則進行驗證。

不幸的是,這意味着有些人會輸入諸如“是的,我會的”之類的選項。 如果我向驗證規則傳遞下拉選項的內嵌列表,這顯然會破壞驗證。

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

Validator類利用PHP的str_getcsv()解析規則的屬性。 該過程類似於:

  • 使用|展開所有規則 管道定界符( Validator::explodeRules()
  • 使用:冒號分隔符( Validator::parseRule() )分解規則名稱和參數。
  • 通過str_getcsv()發送屬性( Validator::parseParameters()

這使您能夠In:與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類。 如果您想要更強大的功能,則無需僅使用“現貨”即購即用的選項。 :)

正如Cryode在回答中所說,Laravel將允許的值解碼為CSV。 這是一個幫助程序方法,可用於從字符串數組中生成此CSV編碼的字符串,而不必擔心手動轉義。

<?php

class ValidatorHelper {

    /*
     * Get an "in" rule from a list of allowed strings
     *
     * @param array $allowed Array of allowed strings, unescaped
     * @return string In rule starting 'in:' with the allowed strings properly 
     * escaped
     */
    public static function inRule(array $allowed) {
        // Laravel separates options via CSV, so we can encode as CSV and not 
        // worry about quotes and commas in the options
        $fp = fopen('php://temp', 'r+');
        fputcsv($fp, $allowed);
        rewind($fp);
        $csv = fgets($fp);
        fclose($fp);
        return 'in:' . $csv;
    }

}

像這樣使用它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM