Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 24.07.2017 16:47:24

Как работает этот кривой валидатор

$validator = \Validator::make(['some key' => 'some value'], [], []);
$validator->errors()->add('error key', 'some error');
dd( [$validator->fails(), $validator->errors()->all()] );

По моей логике fails() должно возвращать TRUE, а errors()->all() должно возвращать массив [ 'error key' => ['some error'] ], но все на оборот, возвращает FALSE (ошибок нет), и пустой массив с ошибками, почему так?

причем, по не понятным причинам в каких то других местах этот чудо валидатор работает, т.е. я сначала проверяю допустим электронный адрес, на то что бы он был задан, что бы длина подходила, что бы был электронным адресом, а потом ОТДЕЛЬНО проверяю по БД не занят ли этот адрес, и если занять то через IF

$validator->errors()->add('user_email', 'электронный адрес уже занят');

оно уже срабатывает.

Я знаю о существовании такой штуки как:

$validator->after(function($validator) {
    $validator->errors()->add('error key', 'some error');
});

но почему не работает просто errors add, а в других местах работает, по каким принципам вообще существует этот валидатор.

PS просьба не задаваться вопросом почему я изначально при валидации не задавал правил и сообщений об ошибке, не об этом вопрос.
Так же просьба не задаваться вопросом зачем я отдельно проверяю данные по БД и через IF добавляю ошибку, если можно в валидаторе задать эту проверку, раз делаю значит надо именно так.


Изучаю Laravel, до этого дела с фреймворками не имел.
Печальные познания в английском.

Не в сети

#2 24.07.2017 17:10:13

Re: Как работает этот кривой валидатор

чёт по-моему ты вообще не понял как работать с валидатором, придумал что-то своё, наколхозил, а оно не взлетело. почитай внимательно https://laravel.com/docs/5.4/validation и больше так не делай

а потом ОТДЕЛЬНО проверяю по БД не занят ли этот адрес

не надо отдельно. см. правило валидации unique – https://laravel.com/docs/5.4/validation#rule-unique

Не в сети

#3 24.07.2017 17:24:01

Re: Как работает этот кривой валидатор

Что я понял не так? можно использовать $this->validate, можно создавать валидатор в ручную - https://laravel.ru/docs/v5/validation#% … 0%BE%D0%B2, я решил создать вручную, потом решил ему добавить ошибку вручную, оно в коде не добавляет, а в другом коде добавляется, при каких обстоятельствах я описал.

Касаемо unique я в курсе, но я просил не вдаваться в это, раз делаю без этой проверки, значит оно так надо. Я не хочу приводить примеры почему так, потому что Вы будите обсуждать их (эти примеры), а не сам вопрос.
Где в 3-х строчках кода я наколхозил?

Изменено GTX (24.07.2017 17:25:51)


Изучаю Laravel, до этого дела с фреймворками не имел.
Печальные познания в английском.

Не в сети

#4 24.07.2017 18:07:14

Re: Как работает этот кривой валидатор

После вызова

$validator->fails()

ларавел запускает валидацию и заново собирает массив ошибок. Т.е. все сообщения, которые ты добавил до вызова fails - сбрасываются.
Поэтому, если хочешь добавить свое сообщение - добавляй его после вызова ->fails();
или через метод after, который ты уже упомянул.

$validator->after(function($validator) {
    $validator->errors()->add('error key', 'some error');
});

Исходный код метода fails

    public function fails()
    {
        return ! $this->passes();
    }
    public function passes()
    {
        $this->messages = new MessageBag;

        // We'll spin through each rule, validating the attributes attached to that
        // rule. Any error messages will be added to the containers with each of
        // the other error messages, returning true if we don't have messages.
        foreach ($this->rules as $attribute => $rules) {
            foreach ($rules as $rule) {
                $this->validate($attribute, $rule);

                if ($this->shouldStopValidating($attribute)) {
                    break;
                }
            }
        }

        // Here we will spin through all of the "after" hooks on this validator and
        // fire them off. This gives the callbacks a chance to perform all kinds
        // of other validation that needs to get wrapped up in this operation.
        foreach ($this->after as $after) {
            call_user_func($after);
        }

        return $this->messages->isEmpty();
    }

внимание:

$this->messages = new MessageBag;

Изменено covobo (24.07.2017 18:15:06)

Не в сети

#5 24.07.2017 18:28:23

Re: Как работает этот кривой валидатор

Во, отличный ответ на вопрос

по каким принципам вообще существует этот валидатор

Большое спасибо covobo, теперь понятно что к чему.

И Вам constb тоже спасибо, все же в этой ссылке https://laravel.com/docs/5.4/validation#rule-unique есть что то новое и полезное.

Изменено GTX (24.07.2017 18:29:09)


Изучаю Laravel, до этого дела с фреймворками не имел.
Печальные познания в английском.

Не в сети

Подвал раздела