Проверка правильности Laravel: правило 'validate_if' - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующая форма данных, отправляемых клиентом:

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

Дополнительные ограничения:

  • КОГДА

    categories[x]fields[x]type =='числа'

    ТО

    categories[x]fields[x]rules.*.from требуется и должно быть подтверждено как NUMERIC

    categories[x]fields[x]rules.*.to необходимо и должно быть подтверждено как NUMERIC

  • КОГДА

    categories[x]fields[x]type == 'даты'

    ТО

    categories[x]fields[x]rules.*.from требуется и должно быть подтверждено как ДАТА

    categories[x]fields[x]rules.*.to требуется и должно быть подтверждено как ДАТА

Я гуглил в простых случаях, рекомендуется сделать что-то вроде этого:

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

Но в моем случае у меня могут быть некоторые элементы в массиве fields, имеющие тип == 'даты' и несколько 'чисел', поэтому я не могу управлять им с помощью if-s.

1 Ответ

0 голосов
/ 29 мая 2018

Как я понял, единственно возможное решение - сделать это в два этапа:

$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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...