簡短回答:將模型傳遞給控制器和視圖。
長答案:在MVC中,控制器不會「從模型加載數據,然後將該數據傳遞給視圖」。該視圖與模型有直接關係,並從中請求數據。請參閱:How is MVC supposed to work in CodeIgniter和http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller:「視圖請求來自模型的信息,它需要生成輸出表示。」因此,爲了實現鬆耦合,可以完全獨立地啓動模型視圖和控制器,並將它們傳遞給對方。
這允許嚴格分離關注MVC的擁護者,並允許您重用任何其他組件,因爲沒有任何硬編碼。
喜歡的東西:
$model = new Model;
$controller = new Controller($model);
$view = new View($model, $controller);
echo $view->output();
控制器不應該選擇視圖,也不應該選擇模型。通過將這個責任放在控制器中,控制器不能與其他視圖或模型重複使用。
編輯:我更新了這個回答tresko關於爲什麼視圖需要知道其控制器的評論。
該視圖需要控制器以避免將控制器硬編碼到視圖中。這是爲了讓視圖知道它在當前上下文中與哪個控制器配對並可以回發給它。
事件(用戶操作)在視圖中觸發,需要由控制器處理。
有3種方式這樣做的:
1)硬編碼視圖:控制器的關係,這是通過使用<a href="/some/hardcoded/route"
實現在網絡上;或<a href="' . $this->router->create('someController, 'action') . '>'
這消除了與其他任何不希望的控制器一起使用視圖的可能性。
2)將控制器傳遞給視圖,讓視圖知道它的事件將被觸發到哪個控制器。在網絡上,使用這種方法,該視圖還需要一個將控制器動作轉換爲路由的路由器。例如<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和3都是很好的方法,但2更好,因爲它允許一個更強大的系統,並允許最重用,缺點是控制器必須實現特定的接口。 3允許控制器具有任何接口,但它必須對其視圖有相當多的瞭解。
CakePHP和其他流行的框架傾向於硬編碼關係(例如http://book.cakephp.org/2.0/en/views.html)在這裏的例子中,echo $this->Html->link('edit', array('action' => 'edit', $post['Post']['id'])); ?>
鏈接只能進入「編輯」控制器。這嚴重影響重用。
謝謝。但是這樣看,我問自己誰需要控制器?我的意思是在應用程序啓動後,我通常可以根據請求參數調用適當的視圖,這將加載視圖,視圖會從模型中請求數據並輸出它:) – kruno
視圖爲什麼控制控制器?如果控制器不可重用,爲什麼你將它注入一個你期望可重用的類中?視角是否期待一個嚴格定義足跡的控制器?在MVC的定義中,哪裏表示View在Controller上執行命令? –
http://upload.wikimedia.org/wikipedia/commons/f/fd/MVC-Process.png下面是維基百科的「MVC過程」圖形。它顯示用戶「使用」控制器。然而,「控制器」對用戶來說沒有意義,他們「使用」視圖。從Java藍圖模型視圖控制器:http://briggs.myweb.port.ac.uk/WEBP/notes/images/mvc-structure-generic.gif「查看 - 發送用戶手勢到控制器」。控制器從視圖中被調用,這是用戶唯一真正與之交互的東西。 –