Laravel验证数组值是否在指定列表中失效问题求助
解决Laravel多选框验证不生效的问题
嘿,我完全懂你遇到的这个头疼问题——明明写了in规则,篡改后的非法值却还是能通过验证,太让人困惑了!
问题根源
你当前的验证规则只写了names.*,但缺少了对names字段本身的类型验证。如果请求中的names不是数组(或者被恶意篡改后绕过了数组校验),Laravel会直接跳过names.*的规则校验;另外,虽然你的请求里names是数组,但有时候直接用字符串形式的in:Jerry,Susan,Tim可能会因为一些细微的格式问题(比如隐性空格)导致校验失效,不过这种情况比较少见。
正确的验证写法
把验证规则改成下面这样,先确保names是数组,再校验数组里的每个元素都在允许的列表内:
public function postNames(Request $request) { $this->validate($request, [ 'names' => 'required|array', // 先确认是数组,非数组直接校验失败 'names.*' => 'in:Jerry,Susan,Tim', // 校验数组每个元素 ]); }
如果你的允许列表是动态生成的(比如从数据库读取),更推荐用Rule::in()的方式,这种写法更清晰也更可靠:
use Illuminate\Validation\Rule; public function postNames(Request $request) { $allowedNames = ['Jerry', 'Susan', 'Tim']; // 可以是动态获取的列表 $this->validate($request, [ 'names' => 'required|array', 'names.*' => Rule::in($allowedNames), ]); }
为什么之前的写法没生效?
当你只写names.*规则时,如果请求中的names字段不存在、是空数组,或者被篡改成非数组类型(比如单个字符串),Laravel会认为names.*没有可校验的元素,直接跳过这条规则,导致非法值通过验证。加上required|array后,首先就能确保names是一个非空数组,之后names.*才会逐个校验数组里的每个元素,彻底拦截非法值。
内容的提问来源于stack exchange,提问作者Matt Pierce




