Laravel如何验证数组键是否在指定白名单字符串数组中?
问题根源
你写的additional_data.*规则是校验数组值的,而你要的是校验additional_data的键是否在白名单里,方向错了,所以验证一直失败。
两种解决办法
方法一:自定义验证规则(适合复用场景)
- 先生成规则文件(嫌麻烦可以跳过直接用闭包)
php artisan make:rule AllowedAdditionalDataKeys
- 替换规则类里的代码:
namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class AllowedAdditionalDataKeys implements Rule { private $allowedKeys; public function __construct(array $allowedKeys) { $this->allowedKeys = $allowedKeys; } public function passes($attribute, $value) { // 拿传入的键和白名单对比,差集为空就通过 return empty(array_diff(array_keys($value), $this->allowedKeys)); } public function message() { return ":attribute 里有不允许的键,只能用这些: " . implode(', ', $this->allowedKeys); } }
- 在验证规则里调用:
use App\Rules\AllowedAdditionalDataKeys; return [ 'name' => ['required'], 'additional_data' => [ 'sometimes', 'array', // 先确保是数组类型 new AllowedAdditionalDataKeys(['type']) ] ];
方法二:闭包验证(快速实现,不用新建文件)
直接在验证规则里写闭包逻辑:
return [ 'name' => ['required'], 'additional_data' => [ 'sometimes', 'array', function ($attribute, $value, $fail) { $allowedKeys = ['type']; $badKeys = array_diff(array_keys($value), $allowedKeys); if (!empty($badKeys)) { $fail("{$attribute} 包含非法键: " . implode(', ', $badKeys)); } } ] ];
关键逻辑
不管哪种方法,核心都是把additional_data的所有键取出来,和你定义的白名单对比,只要有不在白名单里的键,就触发验证失败。
内容的提问来源于stack exchange,提问作者Craig Lovelock
相关产品推荐
相关产品推荐

