【问题标题】:(Laravel) How can I get validation errors from User model?(Laravel)如何从用户模型中获取验证错误?
【发布时间】:2014-01-20 06:02:52
【问题描述】:

我正在尝试在我的应用程序中注册用户,同时将所有业务逻辑保留在模型中,并尽可能少地保留在控制器中。为了实现这一点,当Class::creating() 事件触发时,我在模型的boot() 方法中运行用户验证。如果验证失败,我只是返回 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();
}

我知道我在控制器中没有正确处理该问题,因此我也希望得到一些建议。

谢谢。

【问题讨论】:

  • Services\Validators\RUser?
  • "您看到的验证器类只是规则,它包含一个 getErrors() 函数。"

标签: php validation model controller laravel


【解决方案1】:

你可以设置一个'protected $errors;' User 模型上的属性,然后

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

【讨论】:

    【解决方案2】:

    不是直接回答您的问题,但您应该查看 Ardent 包,该包非常适合自动模型验证,并具有其他一些不错的附带功能。在内部,它使用本地 Laravel 验证器,因此它易于使用,并且可以满足您的要求。它确实节省了很多工作(DRY),我觉得它非常有用。

    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 模型会在 Ardent->save() 被调用时自动验证自己 叫。您还可以随时使用 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 模型验证失败时,一个 Illuminate\Support\MessageBag 对象附加到 Ardent 对象 其中包含验证失败消息。

    检索验证错误消息集合实例 Ardent->errors() 方法或 Ardent->validationErrors 属性。

    使用 Ardent->errors()->all() 检索所有验证错误。取回 使用特定属性的错误 Ardent->validationErrors->get('attribute').

    所以最后你可以这样做:

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

    【讨论】:

    • 谢谢,如果我不能完成这项工作,我可能会回到 Ardent。
    【解决方案3】:

    我在不到 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:重申一下,我是 laravel 的新手,所以我可能完全搞错了。但如果我有,有人会纠正我,我们都会学到一些东西:)

    【讨论】:

    • would 是这样做的方法,但我使用服务进行验证,而不是直接使用控制器中的验证器。
    猜你喜欢
    • 2016-05-27
    • 2016-05-10
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2017-09-27
    • 2021-08-26
    • 2020-09-18
    相关资源
    最近更新 更多