怪我咯2017-04-10 17:12:231樓
TP的controller其實有很多種的
HproseController,JsonRpcController,RestController,RpcController,YarController
我拿RestController給你介紹一下
RESTFul方法的操作方法定義主要區別在于,需要對請求類型和資源類型進行判斷,大多數情況下,通過路由定義可以把操作方法綁定到某個請求類型和資源類型。如果你沒有定義路由的話,需要自己在操作方法里面添加判斷代碼,示例:
namespace Home\Controller;
use Think\Controller\RestController;
Class InfoController extends RestController {
Public function rest() {
switch ($this->_method){
case 'get': // get請求處理代碼
if ($this->_type == 'html'){
}elseif($this->_type == 'xml'){
}
break;
case 'put': // put請求處理代碼
break;
case 'post': // post請求處理代碼
break;
}
}
}
在Rest操作方法中,可以使用$this->_type獲取當前訪問的資源類型,用$this->_method獲取當前的請求類型。
REST控制器類還提供了response方法用于REST輸出: 用法如下:
$this->response($data,'json');
Response方法會自動對data數據進行輸出類型編碼,目前支持的包括xml/json/html。
除了普通方式定義Restful操作方法外,系統還支持另外一種自動調用方式,就是根據當前請求類型和資源類型自動調用相關操作方法。
要使用這種方式的前提就是不能為當前操作定義方法,這樣在空操作的檢查之前系統會首先按照上面的定義規范順序檢查是否存在方法定義,如果檢測到相關的restful方法則不再檢查后面的方法規范,例如我們定義了InfoController如下:
namespace Home\Controller;
use Think\Controller\RestController;
Class InfoController extends RestController {
protected $allowMethod = array('get','post','put'); // REST允許的請求類型列表
protected $allowType = array('html','xml','json'); // REST允許請求的資源類型列表
Public function read_get_html(){
// 輸出id為1的Info的html頁面
}
Public function read_get_xml(){
// 輸出id為1的Info的XML數據
}
Public function read_xml(){
// 輸出id為1的Info的XML數據
}
Public function read_json(){
// 輸出id為1的Info的json數據
}
}
如果我們訪問的URL是:
http://www.domain.com/Info/read/id/1.xml
假設我們沒有定義路由,這樣訪問的是Info控制器的read操作,那么上面的請求會調用InfoController類的 read_get_xml方法,而不是read_xml方法,但是如果訪問的URL是:
http://www.domain.com/Info/read/id/1.jso...
那么則會調用read_json方法。
如果我們訪問的URL是
http://www.domain.com/Info/read/id/1.rss
由于我們不允許rss資源類型的訪問,所以,調用的方法其實是read_html方法。