私が取り組んでいるいくつかのプロジェクトでは、私自身の手作業によるPHP MVCフレームワークがあります。最初にフレームワークを作成したとき、それは管理CMSを構築するというコンテキストの中でした。したがって、モデル、ビュー、コントローラの間には非常に良い1対1の関係がありました。 DBには単一の行があり、単一のモデルにマッピングされます。コントローラはモデルをロードし、レンダリングするビュー(編集フォームなど)に渡します。ニース、クリーン、そして簡単。MVCコントローラからPHPでのビューへのデータの受け渡し
しかし、私はサイトのフロントエンドで作業しているので、物事は固執しています。ページは必ずしも単一のモデルのビューではありません。これは、20人のユーザー(各ユーザーモデル)を持つユーザーディレクトリリストです。さらに、ページ付け(現在のページ、合計ページ、結果の数)および/または検索クエリなど、リクエストに関するメタデータが存在する可能性があります。
私の質問は、このデータをすべてビューに渡す最もクリーンな方法は何ですか。私が検討している
いくつかのオプション:
コントローラは、配列を作成し、単一のパラメータとしてビューにそれを渡すことがあります:
class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $data = array() $data['models'] = $models; $data['currentPage'] = $current; $data['totalPages'] = $total; return $view->render($data); } } class UserView{ public function render($data){ // render the data } }
はでプロパティを作成します。コントローラーにそれらを設定させる:
class UserView{ public $models; public $currentPage; public $totalPages; } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->models = $models; $view->currentPage = $current; $view->totalPages = $total; return $view->render(); } }
任意の数と名前のデータを保持できるコンテナとして、一般的なHashMapまたはCollectionオブジェクトを表示することができます。
class UserView{ public $collection = new Collection(); // works like a Java collection } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->collection->add($models,'models'); $view->collection->add($currentPage,'currentPage'); return $view->render(); } }
は、私は技術的にどのでし仕事のが、私は最良の選択が不明だということを知っている、または私が欠けている、より良い以上の従来の選択肢があるかどう。
おかしい、私はこの質問を投稿する前に、脂肪モデルに関するJamis Buckの記事を読んだが、私はその概念をグーグルで調べることは、そのような豊富なリソースをコンセプトに戻すことは理解していなかった。自分の小さな哲学だと思った。先端に感謝します。 –
良い記事:-)私は完全に脂肪モデルのアイデアに同意するのか分からない。モデルは単なるモデルでなければならないと思います(単数形で)。つまり、FindPeople()のようなメソッドは適合しません。私はしかし、完全に皮肉なコントローラの利点に同意します。サービスレイヤーの引数を入力します。今私はこれについて多くのことを知らず、専門家ではないと主張しますが、私はその価値があると思います。 はい、新しいレイヤの複雑さが増しますが、コントローラはPeopleService :: FindPeople()などを呼び出すことができます –
モデル自体は多層化することができます。いくつかのすぐに使用できるフレームワークには、すでに多層モデルが用意されています。 Symfonyには、DBALとORMの両方が付属しています。これは、propelタスクで足場を張っています。 ZFはテーブルと行のゲートウェイを提供し、ドメインモデルを適用するために私たちに任せます。 Bill Karwinの記事をhttp://karwin.blogspot.com/2008/05/activerecord-does-not-suck.htmlで読んでみることをお勧めします。 –