Добавление правила проверки, только если все остальные правила пройдены или прекращена проверка всего набора атрибутов при первой ошибке в Laravel 5.7 - PullRequest
0 голосов
/ 18 января 2019

Я хочу разрешить пользователю создавать папку на локальном диске. Таким образом, форма, отправляемая на сервер, довольно проста и имеет три атрибута:

  1. имя новой папки - это имя создаваемой папки,
  2. относительный путь - путь к каталогу, внутри которого должен быть создан новый каталог относительно корневого каталога asset и
  3. asset_id - идентификатор актива , мне нужен этот идентификатор, чтобы получить корневой каталог актива .

Дело в том, что когда я проверяю эти атрибуты, мне нужно также проверить, существует ли папка, которую пользователь собирается создать, уже существует. Для этого я создал правило под названием FolderExists. Итак, перед тем, как запустить FolderExists, я должен убедиться, что все остальные правила прошли успешно, потому что мое пользовательское правило должно принимать относительный путь и asset_id , чтобы можно было построить путь проверить.

Вот моя rules() функция, я делаю проверку в пользовательском запросе формы:

public function rules()
{
    return [
        'asset_id' => ['bail', 'required', 'exists:assets,id'],
        'relative-path' => ['bail', 'required', 'string'],
        'new-folder-name' => ['bail', 'required', 'string', 'min:3', new FolderName, new FolderExists($this->input('asset_id'), $this->input('relative-path')]
    ];
}

Итак, мой вопрос:

Можно ли добавить FolderExists, только если все остальные правила проверки пройдены?

Или, возможно, можно остановить всю проверку, когда валидатор обнаружит первую ошибку?

Оба варианта должны быть в порядке.

Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Я наконец-то нашел решение сам. Вот чем я закончил.

Для достижения желаемого результата я создал еще один валидатор в методе withValidator() моего пользовательского запроса формы, этот второй валидатор будет обрабатывать только правило FolderExists и только в случае неудачи предыдущей валидации.

public function rules()
    {
        return [
            'asset-id' => ['bail', 'required', 'integer', 'exists:assets,id'],
            'relative-path' => ['bail', 'required', 'string'],
            'new-folder-name' => ['bail', 'required', 'string', 'min:3', 'max:150', new FolderName]
        ];
    }

public function withValidator($validator)
    {
        if (!$validator->fails())
        {
            $v = Validator::make($this->input(),[
                'new-folder-name' => [new FolderExists($this->input('asset-id'), $this->input('relative-path'))]
            ]);
            $v->validate();
        }
    }

Если наш основной валидатор проходит, мы создаем еще один валидатор и передаем только правило FolderExists с его аргументами, которые уже были проверены, и вызываем validate() метод. Вот и все.

...