Laravel / Eloquent:从模型中进行验证

时间:2014-09-21 17:45:09

标签: php validation laravel eloquent laravel-validation

刚刚掌握Laravel 4.2和雄辩。我一直在laracasts.com上看Scrach演员的Laravel,尤其是关于验证和后续重构的课程。这些课程中使用的示例涉及相对基本的用户模型,其中只有2个字段,用户名和密码。我的用户模型包含更多字段,我的注册表格要求用户重新输入/确认他们输入的密码。

似乎建议验证用户输入的过程应该在模型中完成,这是完全有道理的。就像那个教程一样,我已经开始向我的模型添加isValid方法,以验证我的注册表单上的用户输入。我根据输入填充我的用户模型:

$input = Input::all();
if (!$this->user->fill($input)->isValid()) {
    return Redirect::back()->withInput()->withErrors($this->user->errors);
}

所以我编写了规则并使验证工作正常,我现在准备将用户的输入保存到数据库中。但是,由于我使用整个用户输入填充了我的模型,因此用户模型实例现在包含confirm_password属性,并且调用$user->save();会给我一个错误(因为我没有这个字段)我的数据库表)。另外,由于我刚刚传入了用户输入以进行验证,因此密码也没有散列。

关于验证用户输入VS的最佳方法是什么?该模型实际上代表数据库表?我知道有很多方法可以解决所有这些问题,例如在模型外部移动验证,或者只是让模型存储验证规则等,但我可以寻找有关最佳实践的建议。

由于

2 个答案:

答案 0 :(得分:2)

您可以在保存之前将其删除,例如:

$input = Input::all();
if (!$this->user->fill($input)->isValid()) {
    return Redirect::back()->withInput()->withErrors($this->user->errors);
}
else {
    unset($this->user->attributes['confirm_password']);
    $this->user->save();
}

这可能有效,但不是正确的方法。您也可以使用保存event,如:

// Goes in to your model
protected static function boot()
{
    parent::boot();
    static::saving(function($model) {
        unset($model->attributes['confirm_password']);
    });
}

由于您在模型中进行验证,因此您可以在saving事件上触发验证,例如:

protected static function boot()
{
    parent::boot();
    static::saving(function($model) {
        if($model->isValid()) {
            unset($model->attributes['confirm_password']);
            return true;
        }
        return false;
    });
}

答案 1 :(得分:1)

有更好的方法可以完成同样的事情。

  1. 限制您的输入值。 您可以将Input :: all()传递给验证器并仍然执行此操作。

    $input = Input::only('username', 'password');
    // – OR –
    $input = Input::except('confirm_password');
    
  2. $fillable添加到您的用户模型。

    class User extends Eloquent {
        protected $fillable = array('id', 'name', 'email', 'password');
    }
    
  3. 然后,您可以从Input填充数据库,只会填充可填充数组中的列。 如果您尝试此操作,请确保您具有良好的验证规则。

    $user = User::create(Input::all());
    

    如果不取消设置输入值或添加模型事件,这将完成您要执行的操作。