2017-04-05 8 views
0

現在、lumenを使用してAPIを作成していますが、データベースクエリをどこに置くべきかについて完全に自信がありません。私は、リポジトリのパターンを使用していますが、現在、私のレイアウトはそうのようなものです:リポジトリパターンを使用してLaravelクエリを配置する場所

  1. コントローラの負荷カスタムリポジトリ
  2. リポジトリ方法は、雄弁なクエリが含まれており、その結果を返します。

Controller --> Custom Repository --> Model

Controller <-- Custom Repository <-- Model

- 私は現在、それをやっているかの高レベルのコード例:

Controller.php

public function browse() 
{ 
    // customRepo added via dependency injection 
    $this->customRepo->browse() 
} 

customRepo.php

public function browse() 
{ 
    // other logic here 
    return Member::where('active', 1)->orderBy('date', 'desc')->get() 
} 

Eloquentを使用してデータベースにクエリを行いましたが、私のリポジトリがEloquent(およびいくつかのクエリビルダー)クエリでいっぱいになっているため、これらの呼び出しはすべてRepository内で起こっています。いくつかの情報源から、モデル内にクエリを入れるのはnot correctだと私は見てきました。

私の現在のアプローチはおそらく正しいと思う誰かが決定的に私に何かを教えてくれるかどうかを見たいと思っていました。もしそうでなければカスタムメソッドでモデルをパディングするのは大いに意味がありません必要です。

答えて

1

いくつか考慮する必要があります。最初に、用語についてのいくつかの明確化。例示したリポジトリパターンは実際にはRepository patternではありません。それはData Access Object patternに似ています。両者の違いの簡潔な説明については、quentin-starin's answerを参照してください。第二に、MVCアーキテクチャのモデルは、(この場合はEloquentの)Modelクラスを拡張する単なるクラス以上のものです。多くのことが書かれていますが、簡潔にするために、モデルは一般的に、ドメイン/ビジネスロジックに加えてデータを管理するMVCアプリケーションの複合的な側面です。私はあなたが作成した特定のEloquentベースのクラス(例: - Member)を参照するために、エンティティという用語を使用します。この理解(コード再利用/疎結合/ SRP /など)を考えると、モデル内にクエリを配置することは確かに有益です。しかし、あなたのエンティティで直接データの永続性を扱わないことをお勧めします。残りの質問は、「どのようにモデルやエンティティにアクセスする必要がありますか?」です。

私が見て使った方法の1つは、リポジトリ/ DAOのメソッドをコントローラから直接呼び出すことです。テスト容易性のために、これは問題のエンティティのインスタンスをリポジトリクラスに注入することによって頻繁に実行されます。たとえば、あなたのcustomRepo.php以内に次のようなものを作成することができますファイル:

protected $model; 

public function __construct(\App\Member $model) 
{ 
    $this->model = $model; 
} 

public function getActiveMembers() 
{ 
    return $this->model->where('active', 1)->orderBy('date', 'desc')->get() 
} 

別のアプローチは、リポジトリへの呼び出しサービス層を介してコントローラとリポジトリ間の抽象化の追加の層を作成することです/等。住む。このサービス層は、ドメインイベントを発生させたり、データベーストランザクションなどで複数のデータアクセスメソッドをラップする場所にすることができます。私の個人的なアプローチは、それらの必要性を認識したり、SOLID原則に違反し始めると、新しい抽象レイヤーを作成することです。それまでは、KISS

0

あなたのやっているように、クエリをリポジトリに入れても、私の意見では正しいですし、モデルにクエリを入れてはいけないという考え方に違反していません。つまり、リポジトリとモデルのコンセプトを混在させていると思います。

リポジトリは、特定のタイプのもので構成されたバッグであり、このバッグからアイテムを格納および取得する方法を知っています。

モデルには、モデルのプロパティを正しく処理するためのビジネスロジック以外の機能がほとんどまたはまったく含まれていません(属性の計算が念頭に置かれます)。

関連する問題