You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动