[解決済み] Laravelにおけるリレーションシップの管理、リポジトリパターンへの準拠
質問
Laravelの優れたデザインパターンに関するT. Otwellの本を読んだ後、Laravel 4でアプリケーションを作成しているとき、アプリケーション上のすべてのテーブルのためにリポジトリを作成していることに気づきました。
結局、次のようなテーブル構造になりました。
- 学生:ID、名前
- コース:id、name、teacher_id
- 教師:id, name
- 課題:id、name、course_id
- スコア (学生と課題の間のピボットとして機能します): 学生ID、課題ID、スコア
私は、これらのテーブルのすべてについて、検索、作成、更新、および削除のメソッドを持つリポジトリクラスを持っています。各リポジトリには、データベースと対話する Eloquent モデルがあります。リレーションシップは、Laravelのドキュメントに従ってモデルで定義されています。 http://laravel.com/docs/eloquent#relationships .
新しいコースを作成する場合、私が行うことはコースリポジトリのcreateメソッドを呼び出すことだけです。そのコースには課題があり、課題を作成するとき、コースの各生徒のスコアテーブルにもエントリを作成したいです。私はこれを課題リポジトリを通して行います。これは、課題リポジトリが、課題モデルと学生モデルの2つのEloquentモデルと通信していることを意味します。
私の質問は:このアプリはおそらくサイズが大きくなり、より多くの関係が導入されるため、リポジトリで異なるEloquentモデルと通信することは良い習慣ですか、それともこれは代わりに他のリポジトリを使用して行われるべきですか(私はAssignmentリポジトリから他のリポジトリを呼び出すことを意味します)、またはそれはすべて一緒にEloquentモデルで行われるべきですか?
また、課題と学生の間のピボットとしてスコアテーブルを使用することは良い習慣ですか、それともどこか他の場所で行うべきですか?
どのように解決するのですか?
意見を求めていることに留意してください :D
これが私の意見です。
TL;DR: はい、それで結構です。
あなたは元気です!
私はあなたがやっていることをよくやっていて、とてもうまくいっていると思います。
しかし、私はしばしば、テーブルごとにリポジトリを持つのではなく、ビジネス ロジックを中心にリポジトリを整理します。これは、アプリケーションがどのようにビジネス上の問題を解決すべきかを中心に据えた視点であるため、便利です。
コースは属性 (タイトル、IDなど) および他のエンティティ (課題、それ自身の属性および場合によってはエンティティ) を持つ、quot;エンティティ" です。
あなたのquot;Course"リポジトリはコースおよびコースの属性/割り当て (割り当てを含む) を返すことができる必要があります。
幸運にもEloquentでそれを達成することができます。
(私はしばしばテーブルごとにリポジトリを持つことになりますが、いくつかのリポジトリは他のものよりはるかに多く使用されるため、より多くのメソッドを持ちます。例えば、アプリケーションがコースに重点を置き、コースの課題のコレクションに重点を置かない場合、quot;courses"リポジトリは課題リポジトリよりはるかにフルフィーチャーであるかもしれません)。
トリッキーな部分
私はよく、データベースの操作を行うために、リポジトリ内部でリポジトリを使用します。
データを処理するためにEloquentを実装しているリポジトリは、おそらくEloquentモデルを返すでしょう。この観点から、あなたのCourseモデルがAssignments(または他のユースケース)を取得または保存するためにビルトインリレーションシップを使用しても問題ないでしょう。私たちの実装はEloquentを中心に構築されています。
実用的な観点からは、これは理にかなっています。私たちは、Eloquentが処理できないもの(非SQLデータソース)にデータソースを変更することはまずありません。
ORMS
このセットアップの最も厄介な部分は、少なくとも私にとっては、Eloquent が実際に役立っているのか、それとも害を及ぼしているのかを判断することです。なぜなら、ORM は実用的な観点から大いに役立ちますが、ビジネス ロジック エンティティのコードとデータ検索を行うコードも結合するからです。
これは、リポジトリの責任が実際にデータを処理することなのか、それともエンティティ(ビジネスドメインエンティティ)の取得/更新を処理することなのかを混乱させるようなものです。
さらに、これらはビューに渡すオブジェクトそのものとして動作します。もし、リポジトリでEloquentモデルを使用することから離れなければならない場合、ビューに渡される変数が同じように動作するか、同じメソッドが利用可能であることを確認する必要があり、さもなければデータソースを変更すると、ビューも変更され、そもそもリポジトリに論理を抽象化する目的が(一部)失われ、プロジェクトの保守性が下がります。
とにかく、これらはやや不完全な考えです。これらは、前述のとおり、単に私の意見であり、たまたま ドメイン駆動設計 を読み、次のようなビデオを見た結果です。 ボブおじさんの基調講演 のようなビデオを見ています。
関連
-
[解決済み] リスコフ置換原理の例として、どのようなものがありますか?
-
[解決済み】「結合度が低く、結合度が高い」とはどういう意味ですか?
-
[解決済み】依存関係逆転の原則とは何ですか、なぜそれが重要なのですか?
-
[解決済み] ミュータブルとイミュータブルのオブジェクト
-
[解決済み] ProxyパターンとDecoratorパターンの違い
-
[解決済み] 実装ではなくインターフェースにプログラムする」とはどういう意味ですか?
-
[解決済み】PHPで適切なリポジトリパターンを設計するには?
-
[解決済み] オブジェクト指向分析・設計によるエレベータのモデル化 [終了しました]
-
[解決済み] コンストラクタをprivateにするとどうなるのですか?
-
[解決済み] カプセル化と抽象化の違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] 関数型プログラミングとオブジェクト指向プログラミングの比較【終了しました
-
[解決済み] インターフェースとベースクラス
-
[解決済み] ポリモーフィズムとは何か、何のためにあり、どのように使われるのか?
-
[解決済み] コヒーシ ョンとカップリングの違い
-
[解決済み] 抽象クラスの代わりにインターフェイスを使用する場合とその逆は?
-
[解決済み] メソッドチェイニング - なぜ良い習慣なのか、そうでないのか?
-
[解決済み] Delegateとは?[クローズド]。
-
[解決済み] 継承と集計の比較【終了しました