1

Laravel 4.2 と eloquent に慣れてきました。私は、laracasts.com で Laravel from Scratch キャスト、特に検証に関するレッスンとフォローアップ リファクタリングを見てきました。これらのレッスン全体で使用される例では、ユーザー名とパスワードの 2 つのフィールドしかない比較的基本的なユーザー モデルを扱います。私のユーザー モデルにはさらに多くのフィールドが含まれており、登録フォームでは、ユーザーが入力したパスワードを再入力/確認するよう求められます。

ユーザー入力を検証するプロセスはモデル内で実行することをお勧めしますが、これは完全に理にかなっています。そのチュートリアルと同じようisValidに、登録フォームでのユーザー入力を検証するメソッドをモデルに追加しました。次のような入力に基づいてユーザー モデルを埋めます。

$input = Input::all();
if (!$this->user->fill($input)->isValid()) {
    return Redirect::back()->withInput()->withErrors($this->user->errors);
}

これで、ルールを作成し、検証が機能するようになりました。これで、ユーザーの入力をデータベースに保存する準備が整いました。ただし、モデルにユーザー入力全体を入力したため、ユーザー モデル インスタンスには の属性が含まれるようにconfirm_passwordなり、呼び出すと$user->save();エラーが発生します (データベース テーブルにこのフィールドがないため)。さらに、検証のためにユーザー入力を渡したばかりなので、パスワードもハッシュ化されていません。

モデルが実際にデータベーステーブルを表すユーザー入力 VS の検証に関して、どのようなアプローチを取るのが最善でしょうか? 検証をモデルの外に移動したり、おそらくモデルに検証ルールを保存させたりすることで、これらすべてを回避できる方法があることは知っていますが、ベストプラクティスに関するアドバイスを探すことができます。

ありがとう

4

2 に答える 2

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;
    });
}
于 2014-09-21T17:53:49.180 に答える