Laravel中如何验证复选框提交数组的键是否为合法ID?
问题:Laravel如何验证数组的键是否为合法分类ID?
我有一批name属性为category[{{$category->id}}]的复选框,希望验证这些复选框对应的分类ID是否合法。我了解到可以通过以下方式验证数组:
$input = $request->validate([ 'category' => 'nullable|array', 'category.*' => 'integer|min:1', 'keywords' => 'nullable|string|min:1|max:2000' ]);
但我的需求是验证数组的键而非值,提交的输入数据JSON格式类似{"category": {"1": "on", "8": "on", ...}},我需要检查其中的1、8是否为合法分类ID,至少是整数。请问Laravel验证规则是否支持这种需求?若不支持我将提交功能请求。
解决方案
Laravel原生的验证规则不直接支持验证数组的键,但可以通过以下两种方式实现你的需求,无需提交新功能请求:
方法1:自定义验证规则
创建一个自定义规则来校验数组键的合法性:
- 生成自定义规则文件:
php artisan make:rule ValidCategoryKey
- 在
app/Rules/ValidCategoryKey.php中编写校验逻辑:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class ValidCategoryKey implements Rule { public function passes($attribute, $value) { // 遍历数组所有键,检查是否为正整数 foreach (array_keys($value) as $key) { if (!is_numeric($key) || intval($key) <= 0 || strval(intval($key)) !== $key) { return false; } // 可选:如果需要验证分类ID是否存在于数据库,添加以下代码 // if (!\App\Models\Category::where('id', intval($key))->exists()) { // return false; // } } return true; } public function message() { return '分类ID不合法,请选择有效的分类'; } }
- 在验证逻辑中使用该规则:
$input = $request->validate([ 'category' => 'nullable|array|'.new \App\Rules\ValidCategoryKey, 'keywords' => 'nullable|string|min:1|max:2000' ]);
方法2:手动校验数组键
如果不想创建自定义规则,也可以在控制器中手动完成校验:
// 先做基础验证 $request->validate([ 'category' => 'nullable|array', 'keywords' => 'nullable|string|min:1|max:2000' ]); // 手动检查category数组的键 if ($request->has('category')) { foreach (array_keys($request->category) as $key) { // 验证是否为正整数 if (!is_numeric($key) || intval($key) <= 0 || strval(intval($key)) !== $key) { return redirect()->back()->withErrors(['category' => '分类ID不合法']); } // 可选:验证分类ID是否存在于数据库 // if (!\App\Models\Category::where('id', intval($key))->exists()) { // return redirect()->back()->withErrors(['category' => '所选分类不存在']); // } } }
内容的提问来源于stack exchange,提问作者inf3rno
相关产品推荐
相关产品推荐

