【问题标题】:Validating unique constraints in Laravel using the Ardent validation package使用 Ardent 验证包验证 Laravel 中的唯一约束
【发布时间】:2015-04-13 02:29:31
【问题描述】:

我在我的 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?我是否应该,而不是在控制器中对模型事件执行某些操作,或者是否有一种我遗漏的方法在验证之前更新唯一约束?

【问题讨论】:

  • stackoverflow.com/a/16976208/2962442 唯一约束有 3 个参数,了解更多
  • @kmlnvm 该问题是指使用默认的 laravel 验证,我知道如何使用它,并且通过 ardent 这样做。我对如何修改类公共静态变量更感兴趣,当它本身设置为另一个类中的公共变量并通过$this 访问时
  • 而不是编辑带参数的静态变量创建方法rules,这将返回“编译”规则
  • 静态方法是全局的 - 您不能仅针对存储在 $this->project 中的实例更改 $rules 属性的状态。相反,您必须全局更改属性:Project::$rules['project_key']...
  • @kmlnvm 谢谢,您的评论提示我检查 ardent 是否有一种方法可以做到这一点,并且确实如此。

标签: php laravel-4 ardent


【解决方案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() );
    }

    ...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2019-02-24
    • 2013-05-21
    • 2015-05-08
    • 2014-08-30
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多