[英]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.