ThinkPHP的控制器層由核心控制器和業務控制器組成,核心控制器由系統內部的App類完成,負責應用(包括模組和操作)的調度控制,包括HTTP請求攔截和轉發、載入配置等,業務控制器則由使用者定義的HTTP:// www.aliyun.com/zixun/aggregation/16339.html">Action類或者其他控制器類完成。
我們通過前面的學習,已經瞭解了基本的控制器用法,這一篇我們來講述下控制器的一些特性和高級用法,來探索ThinkPHP控制器的神秘外衣。
Action參數綁定
在前面的內容中,我們涉及的所有操作方法都是沒有任何參數的,其實從3.1版本開始,可以支援參數綁定功能。 Action參數綁定的原理是把URL中的參數(不包括分組、模組和操作名)和控制器的操作方法中的參數(按變數名)進行綁定。
例如,我們給Blog模組定義了兩個操作方法read和archive方法,並且給read操作需要指定一個id參數,archive方法指定年份(year)和月份(month)兩個參數。 為了演示方便,我們省去了具體操作方法的業務代碼,僅僅用echo 輸出當前的參數。 URL的訪問位址分別是: 兩個URL位址中的id參數和year和month參數會自動和read操作方法以及archive操作方法的同名參數綁定。
輸出的結果依次是: Action參數綁定的參數必須和URL中傳入的參數名稱一致,但是參數順序不需要一致。 也就是說 和上面的訪問結果是一致的,URL中的參數順序和操作方法中的參數順序都可以隨意調整,關鍵是確保參數名稱一致即可。
如果使用者訪問的URL位址是(至於為什麼會這麼訪問暫且不提): 那麼會拋出下面的異常提示: 報錯的原因很簡單,因為在執行read操作方法的時候,id參數是必須傳入參數的,但是方法無法從URL位址中獲取正確的id參數資訊。 由於我們不能相信使用者的任何輸入,因此建議你給read方法的id參數添加預設值,例如: 這樣,當我們訪問 的時候 就會輸出 當我們訪問 的時候,輸出: 參數綁定功能不受路由影響,從路由中匹配和URL傳入的參數一樣有效, 並且綁定的參數如果需要特殊處理和過濾的話,需要另行處理。
class BlogAction extends Action{ public function read($id){ echo 'id='.$id; } public function archive($year='2012',$month='01'){ echo 'year='.$year.' &month='.$month; } } HTTP://serverName/index.php/Blog/read/id/5 HTTP://serverName/index.php/Blog/archive/year/2012/month/03 id=5 year=2012&month=03 HTTP://serverName/index.php/Blog/archive/month/03/year/2012 HTTP://serverName/index.php/ Blog/read/ 參數錯誤:id public function read($id=0){ echo 'id='.$id; } HTTP://serverName/index.php/Blog/read/ id=0 HTTP://s erverName/index.php/Blog/archive/ year=2012&month=01