|
在MVC的簡介文章中說明了有關於MVC各自的扮演的角色,事實上有很多令初學者很難一下子就看得清楚的預設機制,尤其是在Controller中的預設流程,這篇文章是在討論由JController程式碼所推演的預設機制。
JController是所有controller的父類別,在程式碼中可以找到以下的執行流程。
初始化過程(建構子):
- 定義了元件的所在目錄作為基礎路徑。
- 定義了taskmap(工作地圖),這是由掃描過子類別檔案中的方法(method)所構成
- 註冊預設的task(工作),即是display
- 定義預設的model尋找的路徑
- 定義預設view尋找的路徑
解說:
- model和view的路徑(或所在目錄)是有一定的規範
- 在控制器子類別中,實作了什麼方法,名稱就會被加到工作地圖中
- display是預設的工作方法
execute方法:
- 由建構子中的工作地圖為基礎,觸發執行對應的方法
- 有存取權限的控制
display方法(預設的工作方法,由JController提供許多預設設定):
- 定義view的文件類型(format),預設是html,所以對應的是view.html.php
- 定義view的類別名稱,預設就是用controller的名稱
- 定義view的版面檔案(樣版檔,位於tmpl),預設使用default.php
- 由2, 3作為參數值得到view類別的實體參考(用&$this->getView方法)
- 用view的類別名稱,去取得model實體參考或建立model實體,代表事實上view和model的名稱會是同名稱,而且預設還是和controller的名稱也一樣(用&$this->getModel或setModel方法)
- 用view設定4中得到的版面(layout)
- controller中的display傳入值用true/false作快取控制
- 執行view的display
解說:
- 預設view, model, controller的名稱都會一樣,例如HelloController(抓到的名稱是hello),view的classprefix是helloView,所以預設的view名稱是HelloViewHello,model的名稱產生類似於view,預設是HelloModelHello。(註:有classprefix的原因應該是要讓單一個controller可以同時控制多個View或Model)
- 如果在view的display中看到以下的程式碼,有可能會誤解是破壞MVC的V和M不相互連繫的規則:
1
2
3
4
|
//Method to get data from a registered model or a property of the view
//return: The return value of the method
//access: public
$greeting = $this->get( 'Greeting' );
|
事實上這是因為JController已經設定好對應的model和view的實體參考,所以當然可以互相連繫。
評論: |