Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет.
У меня в форма представляет собой набор полей которые относятся к двум объектам, уперся в проблему - как мне вернуть сообщения об ошибках в вьюху из обоих объектов? Ошибка может возникнуть и там и там и при чем одновременно в обоих валидаторах.
Вот код кусок кода котроллера
$validation1 = Model1::validate(Input::all());
$validation2 = Model2::validate(Input::all());
if( $validation1->fails() || $validation2->fails() ){
return Redirect::to('url/path/edit?id='.Input::get('id'))->with_errors($validation1)->with_input();
} else {
....
}
Можно конечно возвращать их по очереди, пока ошибки не исправятся, но мне кажется это не правильно.
Не в сети
Я для этого использую массивы: поля ввода первой группы называются group1[FIELD_NAME], второй — group2[FIELD] и т.д. При проверке делается PHPValidator::make(Input::get('group1'), $rules);
, а при возврате ошибок (PHP$validator->errors
) проходишь по ключам и изменяешь их на group1[$old_key]. Тогда больше никаких изменений в Form или где-то ещё делать не нужно, ошибки показываются стандартным образом для нужных полей.
Не в сети
Proger_XP, спасибо за ответ. Но я не много не понял, или не правильно пояснил свою мысль. Валидаторы у меня каждый в своей модели, они прекрасно разбирают каждый свое поле из Input::all() и возвращает каждый свои ошибки.
Проблема в другом - как мне их вернуть в форму отображения через метод with_errors(). Каждый метод валидации каждого объекта возвращает свой Validator объект. А метод with_errors() принимает только один аргумент.
Или при таком раскладе валидацию надо выносить в контроллер, а из моделей брать просто массив $rules мерджить его и применять ко всему Input::all()? ... Хм это вариант, хоть и не совсем элегантный
Не в сети
Просто посмотри на исходник PHPRedirect::with_errors()
и поймёшь, что такое «два разных объекта»:
public function with_errors($container)
{
$errors = ($container instanceof Validator) ? $container->errors : $container;
return $this->with('errors', $errors);
}
return Redirect::with_errors($validation1->errors + $validation2->errors);
Мой совет выше был по части разделения полей каждый в свой массив — очень велика вероятность, что рано или поздно две твои модели получат какое-нибудь общее поле («name», «title», «image» и т.п.) и тебе придётся переделывать всё, что связано с проверками и формами. Лучше уж на ранней стадии это сделать.
Не в сети
Proger_XP, спасибо!
Не в сети
упс, я несколько поторопился )
Теперь пишет вот что на validation1->errors + $validation2->errors : Object of class Laravel\Validator could not be converted to int
Т.е. $validation->errors - это не массив а объект Laravel\Messages
Не в сети
Не в сети
вообще догадался, но просто уперся в еще одни "грабли" )
Может кому полезно будет: оказывается Validator::make() - не делает ни каких проверок, а просто возвращает объект валидатора! А непосредственно проверка вызывается в методах fails(), passes(), invalid(), valid() , т.е. до их вызова свойство errors будет NULL
Я просто всю голову сломал почему у меня после
if( $validation1->fails() || $validation2->fails() ){
$validation2->errors - возвращает NULL ! ))
В общем, Proger_XP, еще раз спасибо. )
Не в сети
- А непосредственно проверка вызывается в методах fails(), passes(), invalid(), valid() , т.е. до их вызова свойство errors будет NULL
Совершенно верно. Это неинтуитивно, но, насколько я понимаю, было сделано, чтобы между созданием объекта и проверкой с этим объектом можно было что-то сделать (заполнить какие-то поля, вызвать методы и т.п.).
PHPif( $validation1->fails() || $validation2->fails() ){
Чтобы обойти «ленивое вычисление» можно использовать побитовый оператор (& для and, | для or).
Не в сети
Страницы 1