私が取り組んでいるいくつかのプロジェクト用に、独自の手巻きの PHP MVC フレームワークがあります。フレームワークを最初に作成したときは、管理 CMS を構築するというコンテキストでした。したがって、モデル、ビュー、およびコントローラーの間には非常に優れた 1 対 1 の関係がありました。DB には単一のモデルにマップされる単一の行があります。コントローラーはモデルをロードし、それをビューに渡してレンダリングします (編集フォームなど)。美しく、きれいで、簡単です。
しかし、サイトのフロントエンドに取り組んでいるので、物事は厄介になってきています。ページは、常に 1 つのモデルのビューであるとは限りません。これは、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(); } }
技術的にはどれでも機能することはわかっていますが、最善の選択がわからなかったり、見逃しているより優れた、またはより従来の選択肢があるかどうかはわかりません。