簡単な答え: モデルをコントローラーとビューに渡します。
長い答え: MVC では、コントローラーは「モデルからデータをロードし、そのデータをビューに渡す」ことはしません。ビューはモデルと直接関係があり、そこからデータを要求します。参照: CodeIgniterおよびhttp://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controllerで MVC がどのように機能するか:出力表現を生成します。」
そのため、疎結合を有効にするには、モデル ビューとコントローラーを完全に独立して開始し、それらを相互に渡します。
これにより、MVC 支持者が主張する懸念事項を厳密に分離することができ、何もハードコーディングされていないため、任意のコンポーネントを他のコンポーネントと再利用できます。
何かのようなもの:
$model = new Model;
$controller = new Controller($model);
$view = new View($model, $controller);
echo $view->output();
コントローラーはビューを選択するべきではなく、モデルを選択するべきでもありません。この責任をコントローラーに置くことで、コントローラーは他のビューやモデルで再利用できなくなります。
編集:ビューがそのコントローラーについて知る必要がある理由についてのトレスコのコメントに答えるためにこれを更新しました。
コントローラーをビューにハードコーディングするのを避けるために、ビューにはコントローラーが必要です。これは、ビューが現在のコンテキストでペアになっているコントローラーを認識し、それにポストバックできるようにするためです。
イベント (ユーザー アクション) はビューで発生し、コントローラーで処理する必要があります。
それには 3 つの方法があります。
1) view:controller の関係をハードコーディングします。Web では、これは<a href="/some/hardcoded/route"
;を使用して実現されます。または<a href="' . $this->router->create('someController, 'action') . '>'
これにより、望ましくない他のコントローラーでビューを使用する可能性がなくなります。
2) コントローラをビューに渡し、イベントが発生するコントローラをビューに知らせます。Web では、このアプローチを使用すると、コントローラーのアクションをルートに変換するルーターもビューに必要になります。例えば<a href="' . $this->router->getRoute($this->controller, 'action') . '>'
3) ビューをコントローラーに渡し、コントローラーにビューに対するアクションを設定させます: (コントローラー コード) $this->view->setEvent('buttonClick', $this->router->getRoute($this, 'action'))
... (ビュー コード)<a href="' . $this->getEvent('buttonClick') . '>'
これらの、
1) 柔軟性に大きく影響するため、最も望ましくない。ビューは、非常に特定のコントローラーでのみアクションを呼び出すことができます。
2) 開発者の作業量は最小ですが、各コントローラーには特定のインターフェイスが必要です。
3) これは最も技術的な柔軟性を提供しますが、開発者にはより多くの作業が必要であり、コントローラーはそのビューについて多くのことを知る必要があります。API を超えて、ビューで使用できるイベントを知る必要があります。ビューが更新され、新しいアクションがある場合、それを考慮して各コントローラーを更新する必要があります。これは 2) にも当てはまりますが、2 はインターフェイスを使用して簡単に処理できるため、2 を使用するすべてのクラスを追跡する方がはるかに簡単です。
私の意見では、2 と 3 はどちらも優れたアプローチですが、2 の方がはるかに堅牢なシステムを可能にし、最も再利用できるため優れています。欠点は、コントローラーが特定のインターフェイスを実装する必要があることです。3 では、コントローラは任意のインターフェイスを持つことができますが、そのビューについてかなり多くのことを知っている必要があります。
CakePHP やその他の一般的なフレームワークは、この例では関係をハードコーディングする傾向があります (例: http://book.cakephp.org/2.0/en/views.html ) echo $this->Html->link('edit', array( 'action' => 'edit', $post['Post']['id'])); ?>
。リンクは "Edit" コントローラーにしか移動できません。これは再利用に深刻な影響を与えます。