2011-01-28 14 views
1

私はMVCパラダイムを使用するフレームワークを使用しています。それはCodeIgniterですが、私の質問は具体的にフレームワークではありません - より一般的には、MVCを使って作業する場合のベストプラクティスです。MVCとプログラムの状態 - モデルをダムにする必要がありますか?

私はいくつかの状態変数(ユーザー選択、いくつかの一時的な設定、いくつかのデータフィルタリングオプション)を維持するために$ _SESSION変数を使用しています。これはやりやすいほど簡単ですが、これらの変数をモデルとコントローラの両方に使用していることが分かりました。時々私はコントローラーで1つを更新し、モデルでそれを調べます。これは私に、モデルをすべての設定を "認識"させるのが良い考えではないかもしれないので、面白い "臭い"になりました。モデルはデータを取得/操作する要求を受け入れるだけでなく、外部変数を参照しなくても要求に明示的に関係していたものにのみ関係するべきですか?

ここに例があります:私は$ _SESSION ['regionFilter']というセッション変数を1つ持っています。これはコントローラで作成および更新され、ユーザーがドリルダウンしたい販売地域を表します。コントローラがモデルから何らかのデータを要求すると、というモデルを持つモデルがになり、$ _SESSION ['regionFilter']変数が検索され、データベースのSQLを作成するときに使用されます。それは、プログラムの状態に関してモデルを "ダム"にし、$ _SESSION ['regionFilter']変数を必要に応じてどうにかしてバンドルして、その要求に変数を束縛させるようにしているようです。

どのような考えですか?ありがとう!


編集:議論のためのおかげで、人々。私は重複する質問を知っていますが、トピックに関する一般的な議論を見つけるのは苦労しました。「MVCモデルプログラムの状態」を検索した結果、ASP.NET MVC固有のディスカッションに関する疑問が浮き彫りになりました。詳細。

私は閉鎖されたとしてマークしました。あなたの考えをもう一度おねがいします!

+0

[MVCの理解:モデルの "Fat"の概念とコントローラの "Skinny"の概念は何ですか?](http://stackoverflow.com/questions/3109715/understanding-mvc-whats-the-concept-モデルのスキン・オン・コントローラー) – Gordon

+0

@Gordon、私は2つの質問が関連していると思うが、重複していない。 –

+0

私はこの質問が主に参照された質問のサブセットと重なっていると言いたいと思います(残念なことに、私はVennダイアグラムを入力できません)。 – David

答えて

4

あなたはそれが面白いと憂慮していると思います。あなたはモデルに関係ない何かを、モデルに導入しました。

モデルにフィルタを指定しても何の問題もありません。おそらく、地域を表す文字列が使用されます。セッションをそれに渡したいのであれば、自由に感じてください。しかし、セッションのもの(読んでも)をモデルに入れれば、2つの本質的にリンクしています。セッション状態へのモデル。

適切にフィルタリングするモデルで、コントローラからセッション変数を渡す方法を提供しますが、モデルにはセッション変数からフィルタが来たとは考えられません。それはただのフィルタです。

編集:明確にするために、私はそのセッション状態がコントローラ、間違いないモデルの一部であると思います。

+0

+1合意。モデルは、それを実行しているアプリケーションコンテキストから独立しているべきである。 ContextはControllerに属しています(特定のアプリケーションがModelと話すために使用するものです)。モデルに必要なものは、アプリケーションに依存しない形式で供給され、アプリケーションがドメイン内で同じモデルを使用できるようにしてください。 – David

+0

@Davidは合意しました。モデルにセッション状態が含まれている場合、Webブラウザ以外のコンテキストで使用することはできません。セッション状態を再設計または微調整することです。 –

+0

明確な説明をありがとう! – loneboat

2

一般に、私には状態モデルだけのドメインモデルがあります。私はこれがEvanの理論のいくつかの純粋主義者にうまく対応していないことは知っていますが、異機種システムであっても移植性のあるモデルを作成するためにはうまくいきます。これは、SOAのためにうまくいきます(代理パターンが後で優れているかどうかを議論することはできますが)。)

MVCに移動すると、多くのサンプルの方法で2つの概念がブレンドされますが、必ずしもドメインモデルではなく、UIモデルを扱うことになります。モデルは、ビュー(MVVMパターンのViewModel)と結び付けられたモデルです。この論理的な分離がある場合、ビューモデルは元の「モデル」(ドメインモデル?)と表示する必要があるその他の情報の組み合わせになります。これは心配もきれいに分けることができます。

1

検索クラス内でリージョンフィルターが必要な場合は、依存関係注入を使用してそれに渡します。リージョンフィルタは、実際にはドメインモデルクラスである必要があります。リージョンフィルタは、リクエスト間にデータを格納する場所を認識していないはずです。リージョンフィルターが必要なときにリージョンフィルターがそれを持っていることを確認してください。

ドメインモデルとしては、ではなく、がコントローラに属しますが、モデルには含まれています。モデルは単なるデータベースではなく、UI以外のすべてのものです。コントローラはUIレイヤの一部です。現在のリクエストを適切なモデルに委譲するのが唯一の目的です。私はセッションデータや状態がコントローラに属していることを、このページの他の場所で与えられた答えに同意しないことを

public function searchAction() 
{ 
    $customerSearch = new CustomerSearch; 
    $customerSearch->setFilter(new RegionFilter($_SESSION)); 
    $results = $customerSearch->fetchResults(); 

    // do something with $results on User Interface 
} 

注:つまり

、あなたはこのような何かをやっている必要があります。それはしません。セッションデータは永続データです。他の永続化されたデータと同様に、永続化レイヤーにも属します(これもモデルの一部です)。それがセッションデータであることは忘れてください。 Region Filterデータです。

特定の環境への結合を防ぐために、$_SESSION(または任意のスーパーグローバル)の周りのAPIを叩くのは理にかなっています。しかし、RegionFilterStorage_Sessionクラスは依然としてモデルクラスです。

関連する問題