15

私が取り組んでいるいくつかのプロジェクト用に、独自の手巻きの 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();
        }
    }
    

技術的にはどれでも機能することはわかっていますが最善の選択がわからなかったり、見逃しているより優れた、またはより従来の選択肢があるかどうかはわかりません。

4

3 に答える 3

4

Fat Models、Skinny Controllers(または、必要に応じてFat Models Thin Controllers ...)の概念をお勧めします。

言い換えると、モデルが厳密すぎます。RowDataGatewayのようなものだけを表すようにモデルを結び付けることは、非常に制限されます。

実際、優れたモデルは、データベースからデータを読み取っているという事実をまったく隠していると思います。なぜなら、実際には、データはテキストファイル、Webサービス、またはその他のものである可能性があるからです。モデルを単なる栄光のDBALのように扱うと、コントローラーに緊密に結合されたコードがあり、「データはデータベースからのみ取得される」という考え方から脱却することはできません。

于 2009-06-04T05:43:23.897 に答える
0

人気のあるMVC/テンプレートフレームワークに実装されている最初の2つの方法の両方を見てきました。

djangoは最初の方法を使用して、ビューがテンプレートを埋めるために使用する変数のディクショナリをビューに渡します。

smartyは2番目の方法を使用して、Smartyオブジェクトを作成し、コンテナー内の各プロパティに値を割り当てます。

3番目の方法は、基本的に2番目の方法と同じように見えますが、アーキテクチャにわずかな違いがあります。

本当に、あなたがまだ考えていないことは何も言っていないと思います。基本的に、これらはすべて健全なアイデアなので、最も快適だと感じるものは何でも実装してください。

于 2009-06-04T05:38:47.180 に答える
0

私が使用しているものでは、コントローラーにビューのメソッドとプロパティにアクセスできるビュー プロパティが自動的に含まれています。ビューは独自のオブジェクト コンテキストでレンダリングされるため、ビュー ビュー '$this' 内ですべてのパブリック プロパティにアクセスできます。

コントローラーで:

$this->view->myVar = 'test';

そしてビューで:

$this->myVar; // 'test'

どちらも同じビュー オブジェクトの個別のインスタンスであるため、同じことがレイアウトにも当てはまります。

$this->layout->myVar = 'test';

そして、レイアウトで:

$this->myVar; // 'test'

このフレームワークは以前はプロプライエタリでしたが、一般に公開されようとしています。それが役立つと思われる場合は、そこからいくつかのコードを送信していただければ幸いです。通常、最も単純な回答が最良の回答であることを忘れないでください。

于 2009-06-04T06:53:07.207 に答える