1.定義控制器javascript
通常來講,ThinkPHP的控制器是一個類,而操做則是控制器類的一個公共方法。php
控制器一般須要繼承系統的Controller類或者其子類,例如,下面定義了一個 \Home\Controller\IndexController
控制器類: java
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ echo 'hello'; } public function test(){ echo 'test'; } } ?>
控制器的名稱採用駝峯法命名(首字母大寫),操做方法的定義必須是公共方法,不然會報操做錯誤。ajax
IndexController控制器類的hello和test方法就是操做方法,經過下面的URL地址訪問控制器方法: json
http://serverName/Home/Index/hello
數組
http://serverName/Home/Index/test
app
2.實例化控制器 函數
訪問控制器的實例化一般是自動完成的,系統會根據URL地址解析出訪問的控制器名稱自動實例化,而且調用相關的操做方法。 jsonp
若是你須要跨控制器調用的話,則能夠單獨實例化: this
// 實例化Home模塊的User控制器 $user = new \Home\Controller\UserController();
系統爲上面的控制器實例化提供了一個快捷調用方法A,上面的代碼能夠簡化爲:
// 假設當前模塊是Home模塊 $user = A('User'); $blog = A('Admin/Blog');
3.前置和後置操做
前置和後置操做指的是在執行某個操做方法以前和以後會自動調用的方法,不過僅對訪問控制器有效。
前置和後置操做的定義方式以下:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller{ //前置操做方法 public function _before_index(){ echo 'before<br/>'; } public function index(){ echo 'index<br/>'; } //後置操做方法 public function _after_index(){ echo 'after<br/>'; } }
若是咱們訪問 http://serverName/index.php/Home/Index/index
結果會輸出
before
index
after
4.Action參數綁定
參數綁定功能默認是開啓的,其原理是把URL中的參數(不包括模塊、控制器和操做名)和操做方法中的參數進行綁定。
要啓用參數綁定功能,首先確保你開啓了URL_PARAMS_BIND
設置:
'URL_PARAMS_BIND' => true, // URL變量綁定到操做方法做爲參數
默認的參數綁定方式是按照變量名進行綁定,例如:
namespace Home\Controller; use Think\Controller; class BlogController extends Controller{ public function read($id){ echo 'id='.$id; } public function archive($year='2013',$month='01'){ echo 'year='.$year.'&month='.$month; } }
當訪問URL地址:
http://serverName/index.php/Home/Blog/read/id/5
http://serverName/index.php/Home/Blog/archive/year/2013/month/11
兩個URL地址中的id參數和year和month參數會自動和read操做方法以及archive操做方法的同名參數綁定。
按照變量名進行參數綁定的參數必須和URL中傳入的變量名稱一致,可是參數順序不須要一致。
若是使用下面的URL地址進行訪問,參數綁定仍然有效:
http://serverName/index.php?c=Blog&a=read&id=5
http://serverName/index.php?c=Blog&a=archive&year=2013&month=11
若是用戶訪問的URL地址是:
http://serverName/index.php/Home/Blog/read/
那麼會拋出下面的異常提示: 參數錯誤:id
報錯的緣由很簡單,由於在執行read操做方法的時候,id參數是必須傳入參數的,可是方法沒法從URL地址中獲取正確的id參數信息。因爲咱們不能相信用戶的任何輸入,所以建議你給read方法的id參數添加默認值,例如:
public function read($id=0){ echo 'id='.$id; }
始終給操做方法的參數定義默認值是一個避免報錯的好辦法。
第二種方式是按照變量的順序綁定,這種狀況下URL地址中的參數順序很是重要,不能隨意調整。要按照變量順序進行綁定,必須先設置URL_PARAMS_BIND_TYPE
爲1:
'URL_PARAMS_BIND_TYPE' => 1, // 設置參數綁定按照變量順序綁定
操做方法的定義不須要改變,URL的訪問地址分別改爲:
http://serverName/index.php/Home/Blog/read/5
http://serverName/index.php/Home/Blog/archive/2013/11
5.AJAX返回
系統的\Think\Controller類提供了ajaxReturn方法用於AJAX調用後返回數據給客戶端。而且支持JSON、JSONP、XML和EVAL四種方式給客戶端接受數據,而且支持配置其餘方式的數據格式返回。若是是EVAL方式的話,只會輸出字符串data數據。
ajaxReturn方法調用示例:
$data['status'] = 1; $data['content'] = 'content'; $this->ajaxReturn($data);
默認配置採用JSON格式返回數據(經過配置DEFAULT_AJAX_RETURN進行設置),咱們能夠指定格式返回,例如:
// 指定XML格式返回數據 $data['status'] = 1; $data['content'] = 'content'; $this->ajaxReturn($data,'xml');
默認的JSONP格式返回的處理方法是jsonpReturn
,若是你採用不一樣的方法,能夠設置:
'DEFAULT_JSONP_HANDLER' => 'myJsonpReturn', // 默認JSONP格式返回的處理方法
或者直接在頁面中用callback參數來指定。
以下:http://localhost:81/myapp/home/index/test?callback=jsCallback
輸出爲:
jsCallback({"name":"\u5468\u5bcc\u6c11","age":26});
6.跳轉和重定向
系統的\Think\Controller類內置了兩個跳轉方法success和error,用於頁面跳轉提示,並且能夠支持ajax提交。
success和error方法的第一個參數表示提示信息,第二個參數表示跳轉地址,第三個參數是跳轉時間(單位爲秒),例如:
// 操做完成3秒後跳轉到 /Article/index $this->success('操做完成',U('/Article/index'),3); // 操做失敗5秒後跳轉到 /Article/error $this->error('操做失敗',U('/Article/error'),5);
跳轉地址是可選的,success方法的默認跳轉地址是$_SERVER["HTTP_REFERER"]
,error方法的默認跳轉地址是javascript:history.back(-1);
。
默認的等待時間success方法是1秒,error方法是3秒
success和error方法會自動判斷當前請求是否屬於Ajax請求,若是屬於Ajax請求則會調用ajaxReturn方法返回信息。 ajax方式下面,success和error方法會封裝下面的數據返回:
$data['info'] = $message; // 提示信息內容 $data['status'] = $status; // 狀態 若是是success是1 error 是0 $data['url'] = $jumpUrl; // 成功或者錯誤的跳轉地址
Controller類的redirect方法能夠實現頁面的重定向功能。
redirect方法的參數用法和U函數的用法一致,例如:
//重定向到New控制器的Category操做 $this->redirect('New/category', array('cate_id' => 2), 5, '頁面跳轉中...');
7.URL生成
ThinkPHP內置提供了U方法,用於URL的動態生成,能夠確保項目在移植過程當中不受環境的影響。
U方法的定義規則以下(方括號內參數根據實際應用決定):
U('地址表達式',['參數'],['僞靜態後綴'],['顯示域名'])
地址表達式的格式定義以下:
[模塊/控制器/操做#錨點@域名]?參數1=值1&參數2=值2...
若是不定義模塊的話 就表示當前模塊名稱,下面是一些簡單的例子:
U('User/add'); // 生成User控制器的add操做的URL地址 U('Blog/read?id=1'); // 生成Blog控制器的read操做 而且id爲1的URL地址 U('Admin/User/select'); // 生成Admin模塊的User控制器的select操做的URL地址
U方法的第二個參數支持數組和字符串兩種定義方式,若是隻是字符串方式的參數能夠在第一個參數中定義,例如:
U('Blog/cate',array('cate_id'=>1,'status'=>1)); U('Blog/cate','cate_id=1&status=1'); U('Blog/cate?cate_id=1&status=1');
注意:若是你是在模板文件中直接使用U方法的話,須要採用 {:U('參數1', '參數2'…)} 的方式。