Laravel: использование метода иногда валидатора, когда вход является массивом - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть форма, которая отправляет поле structure в виде массива.Массив structure содержит определения столбцов таблицы базы данных.

$validator = Validator::make($request->all(), [
    'structure' => 'required|array|min:1',
    'structure.*.name' => 'required|regex:/^[a-z]+[a-z0-9_]+$/',
    'structure.*.type' => 'required|in:integer,decimal,string,text,date,datetime',
    'structure.*.length' => 'nullable|numeric|required_if:structure.*.type,decimal',
    'structure.*.default' => '',
    'structure.*.index' => 'required_if:is_auto_increment,false|boolean',
    'structure.*.is_nullable' => 'required_if:is_auto_increment,false|boolean',
    'structure.*.is_primary' => 'required_if:is_auto_increment,false|boolean',
    'structure.*.is_auto_increment' => 'required_if:structure.type,integer|boolean',
    'structure.*.is_unique' => 'required_if:is_auto_increment,false|boolean',
    'structure.*.decimal' => 'nullable|numeric|required_if:structure.*.type,decimal|lt:structure.*.length',
]);

Не вдаваясь в объяснение всех правил, следует убедиться, что поле length всегда равно null, когда type не является string или decimal, поскольку вы не можете назначить длину столбцам, отличным от этих типов.Итак, я пытаюсь использовать метод sometimes в экземпляре $validator.

$validator->sometimes('structure.*.length', 'in:null', function ($input) {
    // how to access the structure type here?
});

Мой вопрос находится в закрытии, как мне убедиться, что length только nullдля элемента массива, для которого type имеет значение, отличное от string или decimal.

Я пробовал функцию dd, и кажется, что весь входной массив передается в замыкание.

$validator->sometimes('structure.*.length', 'in:null', function ($input) {
    dd($input);
});

Вот результат метода dd.

imagedd method">

Я могу использовать конструкцию foreach, но это не такне быть ли это неэффективным?Проверка всех элементов для одного элемента?

Как проверить тип только для рассматриваемого элемента массива?

Существует ли способ Laravel для этого?

1 Ответ

0 голосов
/ 06 февраля 2019

Это отличный вопрос.Я взглянул на API для иногда () .Кажется, то, что вы хотите сделать, в настоящее время невозможно с этим.

Возможной альтернативой может быть использование После проверки крюка .Например:

$validator->after(function ($validator) {
    $attributes = $validator->getData()['structure'];

    foreach($attributes as $key => $value) {
        if(! in_array($value['type'], ['string', 'decimal']) && ! is_null($value['length'])) {
            $validator->errors()->add("structure.{$key}.length", 'Should be null');
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...