ThinkPHP筆記-控制器

定義控制器

控制器通常需要繼承系統(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í)候看文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評(píng)論 19 139
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,493評(píng)論 1 23
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,574評(píng)論 0 7
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫(xiě)initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,708評(píng)論 2 4
  • 一節(jié)鄭州開(kāi)往日照方向的列車(chē)內(nèi)擠滿了,間或摻雜著幾枚初高中同學(xué),偶遇時(shí)不無(wú)唏噓人事之易變滄桑。故作謙虛相互寒暄的...
    Samuel1995閱讀 171評(píng)論 0 0

友情鏈接更多精彩內(nèi)容