首页 > 解决方案 > Laravel 验证:规则 'validate_if'

问题描述

我有以下客户端发送的数据形状:

{
   categories: [{
      name: string;
      fields: [{
         type: string;
         name: string;
         rules: [{
            from?: date|number;
            to?: date|number;
            label?: string;
            value?: number;
            rate: number;
         }]
      }]
   }]
}

附加约束:

我在简单的情况下用谷歌搜索,建议这样做:

$rules = [ ... ];
if ($request->get('type') === 'cd') {
   $rules['records.*.memory'] = 'max:700';
} else if ($request->get('type') === 'dvd') {
   $rules['records.*.memory'] = 'max:4700';
}

但在我的情况下,我可以在fields数组中有一些元素的类型为 == 'dates' 和一些'numbers',所以我无法使用 if-s 来管理它。

标签: phplaravelvalidation

解决方案


据我了解,唯一可能的解决方案是分两步完成:

$this->validate($request, [
    'categories' => 'required|array',
    'categories.*.name' => 'required_without:categories.*.isGeneral|string|max:255',
    'categories.*.fields' => 'required|array',
    'categories.*.fields.*.name' => 'required|string',
    'categories.*.fields.*.type' => 'required|in:numbers,dates',
    'categories.*.fields.*.rules' => 'required|array',
]);

$dateFields = [];
$numberFields = [];
foreach ($request->post('categories') as $categoryIndex => $category) {
    $dateFields[$categoryIndex] = ['fields' => []];
    $numberFields[$categoryIndex] = ['fields' => []];
    foreach ($category['fields'] as $fieldIndex => $field) {
        if ($field['type'] === 'numbers') {
            $numberFields[$categoryIndex]['fields'][$fieldIndex] = $field;
        } else if ($field['type'] === 'dates') {
            $dateFields[$categoryIndex]['fields'][$fieldIndex] = $field;
        }
    }
}


$dateFieldsValidator = $this->getValidationFactory()->make($dateFields, [
    '*.fields.*.rules.*.from' => 'required|date',
    '*.fields.*.rules.*.to' => 'required|date|gte:*.fields.*.rules.*.from',
    '*.fields.*.rules.*.rate' => 'required|numeric|between:0,100',
]);

$numberFieldsValidator = $this->getValidationFactory()->make($numberFields, [
    '*.fields.*.rules.*.from' => 'required|numeric',
    '*.fields.*.rules.*.to' => 'required|numeric|gte:*.fields.*.rules.*.from',
    '*.fields.*.rules.*.rate' => 'required|numeric|between:0,100',
]);

$errors = [];

if ($dateFieldsValidator->fails()) {
    $errors = array_merge($errors, $dateFieldsValidator->errors()->getMessages());
}

if ($numberFieldsValidator->fails()) {
    $errors = array_merge($errors, $numberFieldsValidator->errors()->getMessages());
}

推荐阅读