-1

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ルールは現在のレコードに対して検証されないように、レコードの更新時に 3 番目のパラメーターを必要とします。私は通常、コントローラーでこれを次のように行います。

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;

        ...

    }

...

static をどのように更新します$rulesか?コントローラーでそうするのではなく、モデルイベントで何かをする必要がありますか、それとも検証前に一意の制約を更新する方法が不足していますか?

4

1 に答える 1

1

私の質問では、ルールに一意の制約がある場合updateUniquesの代わりに使用されるメソッドが ardent にあるという事実を見落としていたようです。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() );
    }

    ...

}
于 2015-02-12T11:41:02.083 に答える