验证Laravel 5.2中的数组键

时间:2016-08-23 16:29:50

标签: 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 [▶]
]

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

'availabilities' => 'required|integer|exists:days_of_week,id',

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

following example使用类似的表单结构。但它没有涵盖如何验证员工ID。我看到人们添加了一个'id'键以及'name'和'age',并且有一个针对'id'字段的规则,但它很麻烦。

3 个答案:

答案 0 :(得分: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;
});

然后您可以使用以下方法检查输入:

'availabilities' => 'required|array|integer_keys',

在此处找到阵列检查:How to check if PHP array is associative or sequential?

答案 1 :(得分:0)

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

  [
  ...,
  "availabilities" => [
    {
      "id": "z",
      "data" : [0 => "foo"]
    },
    {
      "id": 2,
      "data" : [0 => "bar"]
    }
  ]

]

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

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

答案 2 :(得分:0)

@JurriënDokter的答案是一种变通方法,它使用PHP函数而不是Laravel规则,它可以工作,但是如果您真的想从Laravel验证规则中受益,则必须对验证请求进行一些调整。方法如下:
发出自定义请求:

php artisan make:request NameOfRequest  

在请求中放置以下功能:

protected function prepareForValidation()
{
    $this->merge([
        'availabilities_ids' => array_keys($this->get('availabilities'))
    ]);
}

在规则中:

public function rules()
{
    return [
        // place your other rules here .. 
        'availabilities'       => 'required|array|min:1',
        'availabilities.*'     => 'array',
        'availabilities_ids'      => 'exists:App\Models\Availability,id'
    ];
}

通过这种方式,您可以通过在验证之前修改请求参数来获得使用Laravel的本机验证规则的好处。
请参阅此链接以了解有关prepareForValidation https://laravel.com/docs/8.x/validation#prepare-input-for-validation

的更多信息