刚刚掌握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的最佳方法是什么?该模型实际上代表数据库表?我知道有很多方法可以解决所有这些问题,例如在模型外部移动验证,或者只是让模型存储验证规则等,但我可以寻找有关最佳实践的建议。
由于
答案 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)
有更好的方法可以完成同样的事情。
限制您的输入值。 您可以将Input :: all()传递给验证器并仍然执行此操作。
$input = Input::only('username', 'password');
// – OR –
$input = Input::except('confirm_password');
将$fillable
添加到您的用户模型。
class User extends Eloquent {
protected $fillable = array('id', 'name', 'email', 'password');
}
然后,您可以从Input填充数据库,只会填充可填充数组中的列。 如果您尝试此操作,请确保您具有良好的验证规则。
$user = User::create(Input::all());
如果不取消设置输入值或添加模型事件,这将完成您要执行的操作。