Laravel по-русски

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

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

#1 04.05.2013 12:31:51

Валидация нескольких объектов

Всем привет.
У меня в форма представляет собой набор полей которые относятся к двум объектам, уперся в проблему - как мне вернуть сообщения об ошибках в вьюху из обоих объектов? Ошибка может возникнуть и там и там и при чем одновременно в обоих валидаторах.   


Вот код кусок кода котроллера

		$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 {
                    .... 
                }

Можно конечно возвращать их по очереди, пока ошибки не исправятся, но мне кажется это не правильно.

Не в сети

#2 04.05.2013 12:45:02

Re: Валидация нескольких объектов

Я для этого использую массивы: поля ввода первой группы называются group1[FIELD_NAME], второй — group2[FIELD] и т.д. При проверке делается PHPValidator::make(Input::get('group1'), $rules);, а при возврате ошибок (PHP$validator->errors) проходишь по ключам и изменяешь их на group1[$old_key]. Тогда больше никаких изменений в Form или где-то ещё делать не нужно, ошибки показываются стандартным образом для нужных полей.

Не в сети

#3 04.05.2013 12:58:41

Re: Валидация нескольких объектов

Proger_XP, спасибо за ответ. Но я не много не понял, или не правильно пояснил свою мысль. Валидаторы у меня каждый в своей модели, они прекрасно разбирают каждый свое поле из Input::all() и возвращает каждый свои ошибки.
Проблема в другом - как мне их вернуть в форму отображения через метод with_errors(). Каждый метод валидации каждого объекта возвращает свой  Validator объект. А метод with_errors() принимает только один аргумент.

Или при таком раскладе валидацию надо выносить в контроллер, а из моделей брать просто массив $rules мерджить его и применять ко всему Input::all()? ... Хм это вариант, хоть  и не совсем элегантный

Не в сети

#4 04.05.2013 13:08:21

Re: Валидация нескольких объектов

Просто посмотри на исходник PHPRedirect::with_errors() и поймёшь, что такое «два разных объекта»:

PHP
    public function with_errors($container)
    {
        
$errors = ($container instanceof Validator) ? $container->errors $container;

        return 
$this->with('errors'$errors);
    }

То есть:

PHP
return Redirect::with_errors($validation1->errors $validation2->errors);

Мой совет выше был по части разделения полей каждый в свой массив — очень велика вероятность, что рано или поздно две твои модели получат какое-нибудь общее поле («name», «title», «image» и т.п.) и тебе придётся переделывать всё, что связано с проверками и формами. Лучше уж на ранней стадии это сделать.

Не в сети

#5 04.05.2013 15:09:51

Re: Валидация нескольких объектов

Proger_XP, спасибо!

Не в сети

#6 04.05.2013 15:22:26

Re: Валидация нескольких объектов

упс, я несколько поторопился )


Теперь пишет вот что на validation1->errors + $validation2->errors :  Object of class Laravel\Validator could not be converted to int
Т.е. $validation->errors  - это не массив а объект Laravel\Messages

Не в сети

#7 04.05.2013 15:53:32

Re: Валидация нескольких объектов

Да, действительно, я забыл, что там объект. Но это ничего не меняет — неужели сам не догадался просто добавить сообщения из одного Validator в другой?

PHP
$validation1->errors->messages += $validation2->errors->messages;
Redirect::with_errors($validation1);

Если нужен новый объект — склонируй и добавь в него.

Не в сети

#8 04.05.2013 16:12:22

Re: Валидация нескольких объектов

вообще догадался, но просто уперся в еще одни "грабли" )
Может кому полезно будет: оказывается Validator::make() -  не делает ни каких проверок, а просто возвращает объект валидатора!  А непосредственно проверка вызывается в методах fails(), passes(),  invalid(), valid() , т.е. до их вызова свойство errors будет NULL

Я просто всю голову сломал почему у меня после 

 if( $validation1->fails() || $validation2->fails() ){ 

$validation2->errors - возвращает NULL ! ))


В общем, Proger_XP, еще раз спасибо. )

Не в сети

#9 04.05.2013 19:03:27

Re: Валидация нескольких объектов

  1. А непосредственно проверка вызывается в методах fails(), passes(), invalid(), valid() , т.е. до их вызова свойство errors будет NULL

Совершенно верно. Это неинтуитивно, но, насколько я понимаю, было сделано, чтобы между созданием объекта и проверкой с этим объектом можно было что-то сделать (заполнить какие-то поля, вызвать методы и т.п.).

  1. PHPif( $validation1->fails() || $validation2->fails() ){

Чтобы обойти «ленивое вычисление» можно использовать побитовый оператор (& для and, | для or).

Не в сети

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