標籤:style blog http color io os 使用 java ar
1.定義控制器
一般來說,ThinkPHP的控制器是一個類,而操作則是控制器類的一個公用方法。
控制器通常需要繼承系統的Controller類或者其子類,例如,下面定義了一個 \Home\Controller\IndexController 控制器類:
<?phpnamespace Home\Controller;use Think\Controller;class IndexController extends Controller { public function hello(){ echo ‘hello‘; } public function test(){ echo ‘test‘; }}?>
控制器的名稱採用駝峰法命名(首字母大寫),操作方法的定義必須是公用方法,否則會報操作錯誤。
IndexController控制器類的hello和test方法就是操作方法,通過下面的URL地址存取控制器方法:
http://serverName/Home/Index/hello
http://serverName/Home/Index/test
2.執行個體化控制器
存取控制器的執行個體化通常是自動完成的,系統會根據URL位址解析出訪問的控制器名稱自動執行個體化,並且調用相關的操作方法。
如果你需要跨控制器調用的話,則可以單獨執行個體化:
// 執行個體化Home模組的User控制器$user = new \Home\Controller\UserController();
系統為上面的控制器執行個體化提供了一個快捷調用方法A,上面的代碼可以簡化為:
// 假設當前模組是Home模組$user = A(‘User‘); $blog = A(‘Admin/Blog‘);
3.前置和後置操作
前置和後置操作指的是在執行某個操作方法之前和之後會自動調用的方法,不過僅對存取控制器有效。
前置和後置操作的定義方式如下:
<?phpnamespace 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‘…)} 的方式。
thinkphp學習2-控制器