【问题标题】:Laravel array key validationLaravel 数组键验证
【发布时间】:2019-10-21 15:57:49
【问题描述】:

我有自定义请求数据:

{
    "data": {
        "checkThisKeyForExists": [
            {
                "value": "Array key Validation"
            }
        ]
    }
}

还有这个验证规则:

$rules = [
    'data' => ['required','array'],
    'data.*' => ['exists:table,id']
];

如何使用 Laravel 验证数组键?

【问题讨论】:

  • 使用像 data.*.value 这样的嵌套点运算符
  • 我有带有定义键的自定义数组,例如$keys = ['foo', 'bar'],我必须检查请求数组键是否存在我定义的键。数组键不能代替定义的键。 @SagarGautam

标签: laravel validation


【解决方案1】:

我认为这就是您正在寻找的:

$rules = [
   'data.checkThisKeyForExists.value' => ['exists:table,id']
];

【讨论】:

  • 数组键不是静态的,我必须将给定的键与我定义的键进行比较。如果请求中的给定键存在于定义的数组键中,则返回 true 否则返回 false @Sallmin Rexha
  • 我必须检查存在的数组键而不是数组值@Sallmin Rexha
  • 不知道你能不能做到。
【解决方案2】:

正确的方式
这在开箱即用的 Laravel 中是不可能的,但您可以添加一个新的验证规则来验证数组键:

php artisan make:rule KeysIn

规则大致如下所示:

class KeysIn implements Rule
{
    public function __construct(protected array $values)
    {
    }

    public function message(): string
    {
        return ':attribute contains invalid fields';
    }

    public function passes($attribute, $value): bool
    {
        // Swap keys with their values in our field list, so we
        // get ['foo' => 0, 'bar' => 1] instead of ['foo', 'bar']
        $allowedKeys = array_flip($this->values);

        // Compare the value's array *keys* with the flipped fields
        $unknownKeys = array_diff_key($value, $allowedKeys);

        // The validation only passes if there are no unknown keys
        return count($unknownKeys) === 0;
    }
}

你可以像这样使用这个规则:

$rules = [
    'data' => ['required','array', new KeysIn(['foo', 'bar'])],
    'data.*' => ['exists:table,id']
];

快捷方式
如果你只需要这样做一次,你也可以用快速而肮脏的方式来做:

$rules = [
    'data' => [
        'required',
        'array',
        fn(attribute, $value, $fail) => count(array_diff_key($value, $array_flip([
            'foo',
            'bar'
        ]))) > 0 ? $fail("{$attribute} contains invalid fields") : null
    ],
    'data.*' => ['exists:table,id']
];

【讨论】:

    【解决方案3】:

    也许对你有帮助

    $rules = ([
            'name' => 'required|string',              //your field
            'children.*.name' => 'required|string',           //your 1st nested field
            'children.*.children.*.name => 'required|string'        //your 2nd nested field
        ]);
    

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2016-09-01
      • 2021-07-24
      相关资源
      最近更新 更多