繁体   English   中英

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

[英]Laravel/Eloquent: Validation from within the model

只是掌握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的最佳方法是什么?该模型实际上代表数据库表? 我知道有很多方法可以解决所有这些问题,例如在模型外部移动验证,或者让模型存储验证规则等,但我可以就最佳实践寻求建议。

谢谢

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

$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. 限制输入值。 您可以将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'); } 

然后,您可以从Input填充数据库,只会填充可填充数组中的列。 如果您尝试这样做,请确保您有良好的验证规则。

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

这将完成您尝试执行的操作,而无需取消设置输入值或添加模型事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM