我正在尝试在我的应用程序中注册用户,同时将所有业务逻辑保留在模型中,并尽可能少地保留在控制器中。为实现此目的,当boot()
事件触发时,我正在模型的Class::creating()
方法中运行用户验证。如果验证失败,我只返回false,取消该事件。你可以在这里看到:
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 :(得分:6)
你会设置'protected $ errors;'用户模型上的属性,然后
User::creating(function(){
$validator = new Services\Validators\RUser;
if (! $validator->passes()) {
$this->errors = $validation->getErrors();
return false;
}
});
答案 1 :(得分:3)
不是您问题的直接答案,但您应该查看适用于自动模型验证的Ardent软件包,并具有一些其他不错的附带功能。在内部,它使用原生的Laravel验证器,因此它易于使用,并且可以满足您的要求。它确实节省了很多工作(干),我发现它非常有用。
https://github.com/laravelbook/ardent
文档的基础知识:
Ardent模型使用Laravel的内置Validator类。定义 模型的验证规则很简单,通常在您的模型中完成 模型类作为静态变量:
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模型会自动验证 调用。您还可以随时使用。验证模型 Ardent-> validate()方法。
$user = new User;
$user->name = 'John doe';
$user->email = 'john@doe.com';
$user->password = 'test';
$success = $user->save(); // returns false if model is invalid
当Ardent模型无法验证时,a Illuminate \ Support \ MessageBag对象附加到Ardent对象 其中包含验证失败消息。
使用检索验证错误消息集合实例 Ardent-> errors()方法或Ardent-> validationErrors属性。
使用Ardent-> errors() - > all()检索所有验证错误。取回 使用特定属性的错误 Ardent-> validationErrors->获得( '属性')
所以最后你可以这样做:
$user = new User;
$user->name = 'John doe';
$user->email = 'john@doe.com';
$user->password = 'test';
if(!$user->save())
{
print_r($user->errors()->all()); //or whatever else you wish to do on failure
}
答案 2 :(得分:0)
我在不到12小时前第一次安装Laravel,所以我可能会过早地表现,但据我所知......
您有两个主要选项,返回验证程序类,或将错误存储在用户模型中。我正在使用前者,所以我有一个validate()方法返回Validator类,然后我在我的控制器中执行if($v->passes())
并可以通过$v->messages()
在控制器中输出错误。
如果要在失败时继续返回false,则需要使用您的方法将错误存储在User对象中。所以你可以改变:
if (! $validator->passes()) return false;
到
if (! $validator->passes()) {
$this->errors = $validator->messages();
return false;
}
并在您的控制器中执行:
if(isset($user->errors)) {
//loop and print errors from validator
}
N.B:重申一下,我是一个完整的新手,因此我可能会遇到一些完全错误的事情。但如果我有,有人会纠正我,我们都会学到一些东西:)