2014-01-02 3 views
3

Я пытаюсь зарегистрировать пользователя в своем приложении, сохраняя при этом всю бизнес-логику в модели и как можно меньше в контроллере. Чтобы выполнить это, я запускаю проверку пользователя в методе boot() модели, когда срабатывает событие Class::creating(). Если проверка не выполняется, я просто возвращаю false, отменяя событие. Вы можете увидеть это здесь:(Laravel) Как я могу получить ошибки проверки из модели пользователя?

public static function boot() { 
    parent::boot(); 
    User::creating(function(){ 
     $validator = new Services\Validators\RUser; 
     if (! $validator->passes()) return false; 
    }); 
} 

Валидатор класса вы видите просто правила и содержит getErrors() функцию.

Мой вопрос в том, как я могу переписать это, чтобы получить ошибки валидатора для использования в условном переадресации позже?

Мой контроллер postRegister() (функция вызывается при нажатии подают на форме) выглядит следующим образом:

public function postRegister() { 
    $user = new User(Input::all()); 
    $user->save(); 
} 

Я знаю, что я не обработки, что в правильно контроллера, так что я был бы признателен за консультацию это также.

Спасибо.

+0

'Services \ валидаторов \ RUser'? –

+0

«Класс валидатора, который вы видите, - это просто правила и содержит функцию getErrors()». <- Вот что это. –

ответ

6

Вы должны установить «защищенные ошибки»; собственность на модели пользователя, а затем

User::creating(function(){ 
    $validator = new Services\Validators\RUser; 
    if (! $validator->passes()) { 
     $this->errors = $validation->getErrors(); 
     return false; 
    } 
}); 
0

Я установил Laravel в первый раз меньше, чем 12 часов назад, так что я может действовать немного преждевременно, но, насколько мне известно ...

У вас есть два основных варианта, вернуть валидатор класса, или магазин ошибки в модели пользователя. В настоящее время я работаю с первым, поэтому у меня есть метод validate(), который возвращает класс Validator, который затем выполняет if($v->passes()) в моем контроллере и может выводить ошибки в контроллере через $v->messages().

Используя ваш метод, вы захотите сохранить свои ошибки в объекте User, если хотите продолжить возврат false при ошибке. Таким образом, вы можете изменить:

if (! $validator->passes()) return false; 

в

if (! $validator->passes()) { 
    $this->errors = $validator->messages(); 
    return false; 
} 

и в контроллере сделать:

if(isset($user->errors)) { 
    //loop and print errors from validator 
} 

NB: просто повторить, им полный новичок в Laravel, так что я, возможно, получили что-то совершенно неправильное. Но если у меня есть, кто-то меня исправит, и мы оба узнаем что-то :)

+0

Это * будет *, чтобы это сделать, но я использую службы для проверки вместо прямого использования валидатора в контроллере. –

3

Не является прямым ответом на ваш вопрос, но вы должны проверить Ardent пакета, который отлично подходит для автоматической проверки модели и имеют некоторые другие приятные сопутствующие функции. Внутри он использует собственные валидаторы Laravel, поэтому он прост в использовании и будет делать то, о чем вы просите. Это действительно экономит много работы (DRY), и я считаю это очень полезным.

https://github.com/laravelbook/ardent

Основы из документации:

Пламенные модели используют встроенный класс Validator Laravel в. Определение правил проверки для модели проста и, как правило, делается в вашем классе модели как статическая переменная:

class User extends \LaravelBook\Ardent\Ardent { 
     public static $rules = array(
     'name'     => 'required|between:4,16', 
     'email'     => 'required|email', 
     'password'    => 'required|alpha_num|between:4,8|confirmed', 
     'password_confirmation' => 'required|alpha_num|between:4,8', 
    ); 
    } 

Пламенные модели проверки себя автоматически при Ardent-> Save() является называется. Вы также можете проверить модель в любое время, используя метод Ardent-> validate().

$user   = new User; 
$user->name  = 'John doe'; 
$user->email = '[email protected]'; 
$user->password = 'test'; 

$success = $user->save(); // returns false if model is invalid 

Когда Пылкая модель не для проверки, объекта Осветите \ Support \ MessageBag прикрепляются к ретивому объекту , который содержит сообщения об ошибках валидации.

Извлечь экземпляр сбора сообщений об ошибках проверки с помощью метода Ardent-> errors() или Ardent-> validationErrors.

Извлечь все ошибки проверки с помощью Ardent-> errors() -> all(). Получить ошибки для определенного атрибута с помощью Ardent-> validationErrors-> get ('attribute').

Таким образом, в конце концов, вы можете сделать:

$user   = new User; 
$user->name  = 'John doe'; 
$user->email = '[email protected]'; 
$user->password = 'test'; 

if(!$user->save()) 
{ 
    print_r($user->errors()->all()); //or whatever else you wish to do on failure 
} 
+0

Спасибо, я могу просто вернуться к Ярости, если я не смогу сделать эту работу. –

Смежные вопросы