表单验证之 in:foo,bar
文档链接
in:foo,bar,…
验证字段必须包含在给定的值列表中。由于此规则通常要求你 implode
数组,因此可以使用 Rule::in
方法来流畅地构造规则:
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
],
]);
问题来了
$data = $request->validate([
'language' => 'in:zh,en',
'type' => 'in:文字案例,微案例,视频案例',
]);
英文规则language
能正常通过验证,中文规则type
仅输入项为规则中第一项时可以通过,其他不能通过验证。
尝试一
尝试将language
规则改为:'language' => 'in:中文,英文',
后同上,输入项为中文
时可以通过,英文
不能通过验证。
尝试二
将验证规则改为Rule:in()
:
$data = $request->validate([
'language' => Rule::in(['中文','英文']),
'type' => Rule::in(['文字案例','微案例','视频案例']),
]);
结果问题依旧。
尝试三
尝试使用闭包:
$data = $request->validate([
'type' => function ($attribute, $value, $fail) {
if (!in_array($value, ['文字案例','微案例','视频案例'])) {
$fail('案例类型选择错误');
}
},
]);
终于正常了!
求大神深究一下原因,感谢!
正在努力学习的小逗比 [ dobeen.net ]
您好,我之前也遇到过这个问题。
具体请查看 Issue
我本地测试你的代码没有问题,不需要使用闭包。
我的环境是 MacOS, PHP8.1, Laravel9
建议你把这段代码扔到 Linux 环境试一下。