定義控制器
控制器通常需要繼承系統(tǒng)的Controller類(lèi)或者其子類(lèi),例如,下面定義了一個(gè)\Home\Controller\IndexController
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function hello(){ echo 'hello'; }
public function test(){ echo 'test'; }
}
控制器的名稱(chēng)采用駝峰法命名(首字母大寫(xiě)),控制器文件位于Home/Controller/IndexController.class.php.
多層控制器
看文檔,主要就是可以把控制器分為什么訪問(wèn)控制器、事件控制器之類(lèi)的,訪問(wèn)控制器主要用于處理url什么的。如果定義其他層次的控制器可以不用繼承Control類(lèi)。
多級(jí)控制器
看文檔,就是定義子目錄的深度
實(shí)例化控制器
A方法實(shí)例化的是默認(rèn)控制器層(Controller),如果你要實(shí)例化其他的分層控制器的話,可以使用:
// 假設(shè)當(dāng)前模塊是Home模塊// 實(shí)例化Event控制器
$User = A('User','Event');
$Blog = A('Admin/Blog','Event');
上面的代碼等效于:
// 實(shí)例化Home模塊的User事件控制器
$User = new \Home\Event\UserEvent();
// 實(shí)例化Admin模塊的Blog事件控制器
$Blog = new \Admin\Event\BlogEvent();
前置和后置操作
前置和后置操作指的是在執(zhí)行某個(gè)操作方法之前和之后會(huì)自動(dòng)調(diào)用的方法,不過(guò)僅對(duì)訪問(wèn)控制器有效。
<?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/>'; }}
如果我們?cè)L問(wèn)http://serverName/index.php/Home/Index/index
結(jié)果會(huì)輸出
before
index
after
Action參數(shù)綁定
看文檔
偽靜態(tài)
就是可以再u(mài)rl后面加上后綴。
URL大小寫(xiě)
'URL_CASE_INSENSITIVE' =>true加上這個(gè)配置,項(xiàng)目就會(huì)不區(qū)分大小寫(xiě)。
這里需要注意一個(gè)地方,一旦開(kāi)啟了不區(qū)分URL大小寫(xiě)后,如果我們要訪問(wèn)類(lèi)似UserTypeController的控制器,那么正確的URL訪問(wèn)應(yīng)該是:
// 正確的訪問(wèn)地址
http://serverName/index.php/home/user_type/index
// 錯(cuò)誤的訪問(wèn)地址(linux環(huán)境下)
http://serverName/index.php/home/usertype/index
URL生成
U('地址表達(dá)式',['參數(shù)'],['偽靜態(tài)后綴'],['顯示域名'])
地址表達(dá)式的格式定義如下:
[模塊/控制器/操作#錨點(diǎn)@域名]?參數(shù)1=值1&參數(shù)2=值2...
Ajax返回
主要就是調(diào)用ajaxReturn方法。
默認(rèn)配置采用JSON格式返回?cái)?shù)據(jù)(通過(guò)配置DEFAULT_AJAX_RETURN進(jìn)行設(shè)置),我們可以指定格式返回,例如:
// 指定XML格式返回?cái)?shù)據(jù)
$data['status'] = 1;
$data['content'] ='content';
$this->ajaxReturn($data,'xml');
頁(yè)面跳轉(zhuǎn)
系統(tǒng)的\Think\Controller類(lèi)內(nèi)置了兩個(gè)跳轉(zhuǎn)方法success和error。
success和error方法的第一個(gè)參數(shù)表示提示信息,第二個(gè)參數(shù)表示跳轉(zhuǎn)地址,第三個(gè)參數(shù)是跳轉(zhuǎn)時(shí)間(單位為秒),例如:
// 操作完成3秒后跳轉(zhuǎn)到 /Article/index
$this->success('操作完成','/Article/index',3);
// 操作失敗5秒后跳轉(zhuǎn)到 /Article/error
$this->error('操作失敗','/Article/error',5);
頁(yè)面跳轉(zhuǎn)模板文件
success和error方法都可以對(duì)應(yīng)的模板,默認(rèn)的設(shè)置是兩個(gè)方法對(duì)應(yīng)的模板都是:
//默認(rèn)錯(cuò)誤跳轉(zhuǎn)對(duì)應(yīng)的模板文件
'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
//默認(rèn)成功跳轉(zhuǎn)對(duì)應(yīng)的模板文件
'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
模板文件可以使用模板標(biāo)簽,并且可以使用下面的模板變量:
變量 含義
$message 頁(yè)面提示信息
$error 頁(yè)面錯(cuò)誤提示信息
$waitSecond 跳轉(zhuǎn)等待時(shí)間 單位為秒
$jumpUrl 跳轉(zhuǎn)頁(yè)面地址
跳轉(zhuǎn)與Ajax
success和error方法會(huì)自動(dòng)判斷當(dāng)前請(qǐng)求是否屬于Ajax請(qǐng)求,如果屬于Ajax請(qǐng)求則會(huì)調(diào)用ajaxReturn方法返回信息。 ajax方式下面,success和error方法會(huì)封裝下面的數(shù)據(jù)返回:
$data['info'] = $message; // 提示信息內(nèi)容
$data['status'] = $status; // 狀態(tài) 如果是success是1 error 是0
$data['url'] = $jumpUrl; // 成功或者錯(cuò)誤的跳轉(zhuǎn)地址
重定向
Controller類(lèi)的redirect方法可以實(shí)現(xiàn)頁(yè)面的重定向功能。
redirect方法的參數(shù)用法和U函數(shù)的用法一致(參考URL生成部分),例如:
//重定向到New模塊的Category操作
$this->redirect('New/category', array('cate_id' => 2), 5, '頁(yè)面跳轉(zhuǎn)中...');
上面的用法是停留5秒后跳轉(zhuǎn)到New模塊的category操作,并且顯示頁(yè)面跳轉(zhuǎn)中字樣,重定向后會(huì)改變當(dāng)前的URL地址。
判斷請(qǐng)求類(lèi)型
在很多情況下面,我們需要判斷當(dāng)前操作的請(qǐng)求類(lèi)型是GET 、POST 、PUT或 DELETE,一方面可以針對(duì)請(qǐng)求類(lèi)型作出不同的邏輯處理,另外一方面有些情況下面需要驗(yàn)證安全性,過(guò)濾不安全的請(qǐng)求。
系統(tǒng)內(nèi)置了一些常量用于判斷請(qǐng)求類(lèi)型,包括:
常量 說(shuō)明
IS_GET 判斷是否是GET方式提交
IS_POST 判斷是否是POST方式提交
IS_PUT 判斷是否是PUT方式提交
IS_DELETE 判斷是否是DELETE方式提交
IS_AJAX 判斷是否是AJAX提交
REQUEST_METHOD 當(dāng)前提交類(lèi)型
空操作
空操作是指系統(tǒng)在找不到請(qǐng)求的操作方法的時(shí)候,會(huì)定位到空操作(_empty)方法來(lái)執(zhí)行。
function _emtpy($fuc_name);
注意:空操作方法僅在你的控制器類(lèi)繼承系統(tǒng)的Think\Controller類(lèi)才有效,否則需要自己定義 __call 來(lái)實(shí)現(xiàn)。
空控制器
定義
<?php
namespace Home\Controller;
use Think\Controller;
class EmptyController extends Controller{
public function index(){
//根據(jù)當(dāng)前控制器名來(lái)判斷要執(zhí)行那個(gè)城市的操作
$cityName = CONTROLLER_NAME;
$this->city($cityName); }
//注意 city方法 本身是 protected 方法
protected function city($name){
//和$name這個(gè)城市相關(guān)的處理
echo '當(dāng)前城市' . $name; }
}
插件控制器
看文檔
操作綁定到類(lèi)
主要就是細(xì)化工作,用處不是非常大,用的時(shí)候看文檔。