You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel如何验证数组键是否在指定白名单字符串数组中?

问题根源

你写的additional_data.*规则是校验数组值的,而你要的是校验additional_data的键是否在白名单里,方向错了,所以验证一直失败。

两种解决办法

方法一:自定义验证规则(适合复用场景)

  1. 先生成规则文件(嫌麻烦可以跳过直接用闭包)
php artisan make:rule AllowedAdditionalDataKeys
  1. 替换规则类里的代码:
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);
    }
}
  1. 在验证规则里调用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:05:18