2016-08-05 13 views
2

基本的に、可能な限り最良の方法でこれを行う方法について質問があります。そして、私が最初に正しいことをしているかどうかもわかりません。Laravelのコントローラーからモデルにアクセスするためのベストプラクティス

ユーザーが設定を更新できる設定ページがあります。フォームが提出されると、以下の方法でリクエストを処理しています。

私はProfileモデルとUserモデルを持ち、それらの関係も正しく設定されています。

ご覧のとおり、この方法ではすべてがコントローラで行われます。私はProfileモデルをまったく使っていません。しかし、私はすべきではない?

Profileモデルではど​​のような方法で作成して使用できますか?コントローラーではそれほど効果がありません。

申し訳ありませんが、これは不適切な質問です。

ありがとうございます。

/** 
* @return mixed 
* 
* Process general settings 
*/ 
public function postEditGeneralSettings() { 

    // Validate 
    $val = Validator::make([ 
     'show_age' => Input::get('show_age'), 
     'show_gender' => Input::get('show_gender') 
    ], [ 
     'show_age' => 'sometimes|boolean', 
     'show_gender' => 'sometimes|boolean' 
    ]); 

    if ($val -> fails()) { 
     return $this -> backWithErrors($val); 
    } 

    // Update 
    Auth::user() -> profile() -> update([ 
     'show_age' => Input::get('show_age'), 
     'show_gender' => Input::get('show_gender') 
    ]); 

    return $this -> backWithSuccess('Innstillingene ble lagret!'); 

} 
+0

非常によく見えます。 'Validator :: make'の代わりにForm Requestを使うことをお勧めします。なぜならあなたはより良いSOCを持っているからです。 –

+0

ああ、そうだ。新しいポストプロセスごとに新しいリクエストクラスがあるはずですか?同様に、editGeneralSettings、editSecuritySettings、editText、editStatus? – Kaizokupuffball

答えて

2

あなたは、コントローラからのデータを格納するの責任を押し出すためにリポジトリクラスを使用することができます。

class UserRepository 
{ 
    //rules for validation, as an alternative you can put them in your User Model 
    public static $rules = [ 
     'title' => 'required|unique|max:255', 
     'body' => 'required', 
    ]; 

    public function updateUserProfile($user, $data) 
    { 
     $user->profile()->update([ 
     'show_age' => $data('show_age'), 
     'show_gender' => $data('show_gender') 
    ]);   
} 

そして、コントローラからリポジトリを使用します。

public function postEditGeneralSettings(UserRepository $repo) 
{  
    //an alternative to your validation, using the ValidatesRequests trait of the controller 
    //this will give the same results of your validation, but is more concise 
    $this->validate(CUserRepository::$rules, Input::all()); 

    // Update using the repository 
    $repo->update(Auth::user(), Input::all()); 

    return $this->backWithSuccess('Innstillingene ble lagret!'); 
} 
+0

私はこれを実装しようとします。私はちょうど私がフォルダ構造(クラスを生成するために使用できるCLIコマンドがあります)にこのクラスを置くだろうと思っていただけですか?そして、たくさんのリポジトリクラスが必要でしょうか?または、それぞれのために1つだけ(UserRepo、ProfileRepo、GalleryRepo、MessagesRepo)? – Kaizokupuffball

+0

ファサードは実際にはショートカットなので、私はファサードに頼るのを避ける傾向があります。私の提案では、このメソッドはUserRepositoryの代わりにFormRequestクラスを受け取り、検証ルールはFormRequestクラスになります。また、コントローラの構成にリポジトリを挿入することもできます。リポジトリパターンに関しては、私はgithub.com/andersao/l5-repositoryを提案します。これは事実上完全な解決策です。 –

+0

@Kaizokupuffball:どのレポジトリを使うか、どこに置くかはあなた次第です。あなたのニーズによって異なります。通常は、モデルごとに1つのリポジトリを使用します。 – Moppo

1

として、マルコはここで何も間違っていないと言った。

特定のフォーム要求を作成する必要がなく、検証のためにデフォルトのvalidateメソッド呼び出しを使用することもできます。一般的に、検証が複雑になると特定のフォーム要求クラスに到達します。それ以外の場合はインラインが完璧です。 validate関数でうまくいけば、キャッチされた検証例外がスローされ、エラーセットなどでリダイレクトされます。

アクティブなレコードパターンを取り入れてEloquentを使用しても問題ありません。もう少し明示的にしたい場合は、次のように更新をラップすることができます。

public function postEditGeneralSettings(Request $request) 
{ 
    $this->validate($request, [ 
     'show_age' => 'sometimes|boolean', 
     'show_gender' => 'sometimes|boolean', 
    ]); 

    auth()->user()->updateProfile([ 
     'show_age' => $request->input('show_age'), 
     'show_gender' => $request->input('show_gender'), 
    ]); 

    return $this->backWithSuccess('Innstillingene ble lagret!'); 
} 

class User extends Model 
{ 
    ... 
    public function updateProfile($settings) 
    { 
     $this->profile()->update($settings); 
    } 
} 
関連する問題