验证Laravel 5.2中的数组键

Pat*_*.SE 6 laravel-5.2

提交后我有以下输入表格结构:

array:6 [?
  "_method" => "PATCH"
  "_token" => "h7hb0yLzdYaFY0I4e1I7CQK7Niq9EqgXFTlramn9"
  "candidate" => array:4 [?]
  "languages" => array:3 [?
    0 => "ga"
    1 => "no"
    2 => "sk"
  ]
  "availabilities" => array:2 [?
    "z" => array:1 [?]
    2 => array:3 [?]
  ]
  "experiences" => array:3 [?]
]
Run Code Online (Sandbox Code Playgroud)

我试图验证'供应'数组键,以确保它们对应于数据库中的现有ID:

'availabilities' => 'required|integer|exists:days_of_week,id',
Run Code Online (Sandbox Code Playgroud)

如果我使用此规则它将以主数组为目标,但exists即使我使用浏览器控制台将id更改为"z" ,关键也是通过验证.它失败了integer规则,因为它也检索了一个数组.如何验证数组键?

下面的例子中使用了类似的形式的结构.但它没有涵盖如何验证员工ID.我看到人们添加了一个'id'键以及'name'和'age',并且有一个针对'id'字段的规则,但它很麻烦.

小智 6

如果您可以控制输入数据结构,我建议将其修改为以下内容:

  [
  ...,
  "availabilities" => [
    {
      "id": "z",
      "data" : [0 => "foo"]
    },
    {
      "id": 2,
      "data" : [0 => "bar"]
    }
  ]
Run Code Online (Sandbox Code Playgroud)

]

然后调整您的验证规则,例如针对您的数据库进行验证

public function rules {
    return [
        'availabilities' => 'filled',
        'availabilities.*.id' => 'required|integer|exists:days_of_week,id',
        'availabilities.*.data' => 'required|array'
        // etc...
    ];
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以通过添加自定义验证器来实现。另请参阅:https : //laravel.com/docs/5.2/validation#custom-validation-rules

例如:

\Validator::extend('integer_keys', function($attribute, $value, $parameters, $validator) {
    return is_array($value) && count(array_filter(array_keys($value), 'is_string')) === 0;
});
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令检查输入:

'availabilities' => 'required|array|integer_keys',
Run Code Online (Sandbox Code Playgroud)

在这里找到数组检查:如何检查PHP数组是关联数组还是顺序数组?

  • 从 Laravel 5.5 开始。你也可以直接添加这样的规则作为闭包:https://laravel.com/docs/5.6/validation#using-closures (3认同)