我有一个用户可配置的下拉列表,用户可以在其中使用自己的选项列表填充它。我想用in:foo,bar
那种验证规则来验证它。
不幸的是,这意味着有些人会选择“是的,我愿意”。如果我将下拉选项的内爆列表传递给验证规则,这显然会破坏验证。
是否可以逃避 Laravel 的规则来避免这个问题?
我有一个用户可配置的下拉列表,用户可以在其中使用自己的选项列表填充它。我想用in:foo,bar
那种验证规则来验证它。
不幸的是,这意味着有些人会选择“是的,我愿意”。如果我将下拉选项的内爆列表传递给验证规则,这显然会破坏验证。
是否可以逃避 Laravel 的规则来避免这个问题?
Validator 类使用 PHP 的str_getcsv()来解析规则的属性。该过程类似于:
|
使用管道分隔符 ( Validator::explodeRules()
)展开所有规则:
使用冒号分隔符 ( Validator::parseRule()
)展开规则名称和参数str_getcsv()
通过( Validator::parseParameters()
)发送属性这使您可以像定义In:
CSV 文件一样定义选项列表——每列都用引号引起来!这是一个例子:
$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",
]),
],
]);