Laravel 5.8 Валидация - всегда залог за любое правило - PullRequest
5 голосов
/ 18 марта 2019

Есть ли возможность установить FormRequest правила по умолчанию для использования bail правила без его ввода?

Вместо:

class StoreRequest extends FormRequest {
    function rules() {
        return [
            'name' => 'bail|required|min:3',
            'last_name' => 'bail|required|min:3',
            'names' => 'bail|required|min:3',
            'email' => 'bail|required|email',
            'type' => 'integer|min:10|max:50',
            // [...]
        ];
    }
}

Я хотел бы получить более чистую версию, например:

class StoreRequest extends FormRequest {

    protected $stopsOnFirstError = true; // I can't find anything like this

    function rules() {
        return [
            'name' => 'required|min:3',
            'last_name' => 'required|min:3',
            'names' => 'required|min:3',
            'email' => 'required|email',
            'type' => 'integer|min:10|max:50',
            // [...]
        ];
    }
}

Обновление:

Некоторые из моих правил определены как массив:

'type' => [
    'bail',
    'required',
    'integer',
    Rule::in(ContactType::getValues()),
],

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

1) Без усложнения используйте замену строки

<?php
$rules = [
            'name' => 'required|min:3',
            'last_name' => 'required|min:3',
            'names' => 'required|min:3',
            'email' => 'required|email'
        ];
$stopsOnFirstError = true;
if(stopsOnFirstError){
  array_walk($rules, function(&$value, $key) { $value = 'bail|'.$value; } );
}

print_r($rules);
?>

Демонстрация в реальном времени: Ссылка

Вывод:

Array
(
    [name] => bail|required|min:3
    [last_name] => bail|required|min:3
    [names] => bail|required|min:3
    [email] => bail|required|email
)

2) Вы также можете сделать это другим способом, просто добавив '*' => 'bail',, чтобы применить для всех полей

class StoreRequest extends FormRequest {
    function rules() {
        return [
            '*' => 'bail',
            'name' => 'required|min:3',
            'last_name' => 'required|min:3',
            'names' => 'required|min:3',
            'email' => 'required|email',
        ];
    }
}
0 голосов
/ 18 марта 2019

Вы всегда можете переопределить метод validator в классе запроса формы:

class StoreRequest extends FormRequest {

    private function prependBailOnRule($rule) {
        if (is_string($rule)) {
            return "bail|".$rule;
        } else if (is_array($rule)) {
           return array_merge([ "bail" ], $rule);
        }
    }

    //Adapted from FromRequest::createDefaultValidator
    public function validator(ValidationFactory $factory) {
        return $factory->make(
             $this->validationData(), 
             array_map([$this, 'prependBailOnRule' ], $this->container->call([$this, 'rules'])),
             $this->messages(), $this->attributes()
        );
    }

    function rules() {
        return [
            'name' => 'required|min:3',
            'last_name' => 'required|min:3',
            'names' => 'required|min:3',
            'email' => 'required|email',
            'type' => 'integer|min:10|max:50',
            // [...]
        ];
    }
}
...