Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
$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, до этого дела с фреймворками не имел.
Печальные познания в английском.
Не в сети
чёт по-моему ты вообще не понял как работать с валидатором, придумал что-то своё, наколхозил, а оно не взлетело. почитай внимательно https://laravel.com/docs/5.4/validation и больше так не делай
а потом ОТДЕЛЬНО проверяю по БД не занят ли этот адрес
не надо отдельно. см. правило валидации unique – https://laravel.com/docs/5.4/validation#rule-unique
Не в сети
Что я понял не так? можно использовать $this->validate, можно создавать валидатор в ручную - https://laravel.ru/docs/v5/validation#% … 0%BE%D0%B2, я решил создать вручную, потом решил ему добавить ошибку вручную, оно в коде не добавляет, а в другом коде добавляется, при каких обстоятельствах я описал.
Касаемо unique я в курсе, но я просил не вдаваться в это, раз делаю без этой проверки, значит оно так надо. Я не хочу приводить примеры почему так, потому что Вы будите обсуждать их (эти примеры), а не сам вопрос.
Где в 3-х строчках кода я наколхозил?
Изменено GTX (24.07.2017 17:25:51)
Изучаю Laravel, до этого дела с фреймворками не имел.
Печальные познания в английском.
Не в сети
После вызова
$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)
Не в сети
Во, отличный ответ на вопрос
по каким принципам вообще существует этот валидатор
Большое спасибо covobo, теперь понятно что к чему.
И Вам constb тоже спасибо, все же в этой ссылке https://laravel.com/docs/5.4/validation#rule-unique есть что то новое и полезное.
Изменено GTX (24.07.2017 18:29:09)
Изучаю Laravel, до этого дела с фреймворками не имел.
Печальные познания в английском.
Не в сети
Страницы 1