我在Laravel应用程序中使用 Ardent 来提供记录验证。 Ardent在模型中使用静态$rules
变量来存储验证信息,如下所示:
class Project extends Ardent{
public static $rules = array
(
'name' => 'required|max:40',
'project_key' => 'required|max:10|unique:projects',
);
}
Ardent将在任何保存事件上使用这些相同的规则,但unique:projects
规则在更新记录时需要第三个参数,以便它不会对当前记录进行验证。我通常会在我的控制器中这样做:
class ProjectController{
...
public function update( $id ){
$record = $this->projects->findById($id);
$record::$rules['project_key'] += ',' . $record->id;
if( $record->update(Input::get(array('name','project_key'))) )
{
...
}
return Redirect::back()
->withErrors( $record->errors() );
}
...
}
为了减少重复代码的数量,我已经移动了用于识别记录是否存在的代码以及何时不对另一个将$this->project
设置为当前项目但现在更新的类方法的错误处理模型静态$rules
属性是有问题的,因为下面的工作无法工作:
...
public function update( $id ){
if ( ! $this->identifyProject( $id ) ){
return $this->redirectOnError;
}
$this->project::$rules['project_key'] += ',' . $this->project->id;
...
}
...
您如何更新静态$rules
?我是否应该在控制器中对模型事件执行某些操作,或者是否存在我缺少的一种方法,以便在验证之前更新唯一约束?
答案 0 :(得分:1)
在我的问题中,我忽略了这样一个事实:ardent有一个updateUniques
方法,当您在规则中有唯一约束时,它将用于代替update
。因此,我的初始代码示例变为:
class ProjectController{
...
public function update( $id ){
if ( ! $this->identifyProject( $id ) ){
return $this->redirectOnError;
}
$this->project->fill(Input::only(array('name','project_key')));
if( $this->project->updateUniques() )
{
return Redirect::route('project.edit', $this->project->id)
->with('success', 'Your changes have been saved.');
}
return Redirect::back()
->withErrors( $this->project->errors() );
}
...
}