1. 程式人生 > >TP5.0 請求和響應

TP5.0 請求和響應

今天這篇文章主要寫一下tp5.0的請求(request)響應(response)。關於更多TP5.0的內容請參見[我的部落格列表]

ThinkPHP5 的架構設計和之前版本的主要區別之一就在於增加了 Request 請求物件和 Response 響應對
象的概念,瞭解了這兩個物件的作用和用法對你的應用開發非常關鍵。

請求物件

Request 物件的作用是與客戶端互動,收集客戶端的Form、Cookies、超連結,或者收集伺服器端的環
境變數。

Request物件是從客戶端向伺服器發出請求,包括使用者提交的資訊以及客戶端的一些資訊。客戶端可通過
HTML表單或在網頁地址後面提供引數的方法提交資料,然後通過Request物件的相關方法來獲取這些數
據。Request的各種方法主要用來處理客戶端瀏覽器提交的請求中的各項引數和選項。

Request 物件的一個主要職責是統一和更安全地獲取當前的請求資訊。本著不相信使用者輸入的一切內容的原則,我們應該儘量避免直接使用:$_GET、$_POST、$_COOKIE、$_SESSION等全域性變數。

呼叫方式

  /**
     * @param Request $request 使用自動注入的方式需要用到的引數
     */
 public function request_demo(Request $request)
     {
         /****傳統用法 use think\Request ****/
         //通過例項化獲取 url 不含域名
//$url = Request::instance() -> url(); /*繼承 think\Controller 可以使用的方法*/ //通過繼承父類獲取 url 不含域名 //$url = $this -> request -> url(); /***自動注入請求物件***/ //在沒有繼承think\controller的情況下 use think\Request後 使用 Request 物件注入的方式來簡化呼叫 // ! 此方法的request引數是系統自動注入的,而不需要通過URL請求傳入
$url = $request -> url(); /***使用助手函式獲取***/ //$url = request() -> url(); // ! 另有 動態繫結屬性的方法 獲取 不再贅述 , 如有意向請留言 或自行參考官方快速入門手冊第三章:請求和相應 //輸出請求地址 echo $url; }

上面任意一種方式都可以呼叫當前請求的 Request 物件例項,然後通過請求物件例項的方法來完成不同的
資訊獲取或者設定。

獲取請求變數

public function login(Request $request)
{
     //根據請求型別響應
     if ($request -> isGet()){
         //渲染模板
         return $this -> fetch();
     }elseif ($request -> isPost()){
         //獲取方式有很多種:
         // 1、 $ this -> param(); param 支援變數過濾和預設值 並且會自動判斷當前請求 引數優先順序為 路由變數>post變數>get * ! 這裡的路由變數指的是路由規則裡面定義的變數或者 PATH_INFO 地址中的變數。路由變數無法使用get 方法或者 $_GET 變數獲取。
         // 2、 助手函式 input();  param  的簡化版  類似於 3.2版本的 I() 方法 可獲取get,post,cookie,file,delete,request,env,server……   除了file方法外 其他方法都支援過濾和預設值操作

         // 3、 使用 request 物件獲取
         //使用request 物件獲取 post 引數
         //$param = $request -> post();

    }else{
            return '非法請求';
    }


}

tp5.0預設沒有過濾, 可以設定全域性過濾方法,如下:

  // 預設全域性過濾方法 用逗號分隔多個   預設無過濾  自己設定為 htmlspecialchars 方法過濾
    'default_filter'         => 'htmlspecialchars',

歸納如下
獲取變數的方法

除了file方法外其他方法都支援預設值和過濾方法

獲取請求引數&url資訊

    /**
     * Effect : 獲取當前請求引數
     * @param Request $request  自動注入請求物件
     */
    public function get_param(Request $request)
    {
         //獲取請求引數
         echo '請求方法:' . $request->method() . '<br/>';
         echo '資源型別:' . $request->type() . '<br/>';
         echo '訪問IP:' . $request->ip() . '<br/>';
         //var_export();輸出或返回一個變數的字串表示描述   詳情參見PHP手冊
         echo '是否AJax請求:' . var_export($request->isAjax(), true) . '<br/>';
         echo '請求引數:';
         dump($request->param());
         echo '請求引數:僅包含tel';
         dump($request->only(['tel']));
         echo '請求引數:排除tel';
         dump($request->except(['tel']));

    }
   /**
     * Effect : 獲取當前url資訊
     * @param Request $request  自動注入請求物件
     */
   public function get_url(Request $request)
   {    
        // 獲取當前域名
        echo 'domain:  ' . $request->domain() . '<br/>';
        // 獲取當前入口檔案
        echo 'file:  ' . $request->baseFile() . '<br/>';
        // 獲取當前URL地址 不含域名
        echo 'url: ' . $request->url() . '<br/>';
        // 獲取包含域名的完整URL地址
        echo 'url with domain:  ' . $request->url(true) . '<br/>';
        // 獲取當前URL地址 不含QUERY_STRING
        echo 'url without query: ' . $request->baseUrl() . '<br/>';
        // 獲取URL訪問的ROOT地址
        echo 'root: ' . $request->root() . '<br/>';
        // 獲取URL訪問的ROOT地址
        echo 'root with domain:  ' . $request->root(true) . '<br/>';
        // 獲取URL地址中的PATH_INFO資訊
        echo 'pathinfo:  ' . $request->pathinfo() . '<br/>';
        // 獲取URL地址中的PATH_INFO資訊 不含字尾
        echo 'pathinfo:  ' . $request->path() . '<br/>';
        // 獲取URL地址中的字尾資訊
        echo 'ext: ' . $request->ext() . '<br/>';
    }

歸納如下
獲取請求和資訊的方法歸納
獲取請求和資訊的方法歸納

url、baseUrl、baseFile、root方法如果傳入true,表示獲取包含域名的地址

獲取當前模組、控制器和操作的資訊 &獲取路由排程資訊

public function get_url(Request $request)
    {
        // 獲取當前域名
        echo 'domain:  ' . $request->domain() . '<br/>';
        // 獲取當前入口檔案
        echo 'file:  ' . $request->baseFile() . '<br/>';
        // 獲取當前URL地址 不含域名
        echo 'url: ' . $request->url() . '<br/>';
        // 獲取包含域名的完整URL地址
        echo 'url with domain:  ' . $request->url(true) . '<br/>';
        // 獲取當前URL地址 不含QUERY_STRING
        echo 'url without query: ' . $request->baseUrl() . '<br/>';
        // 獲取URL訪問的ROOT地址
        echo 'root: ' . $request->root() . '<br/>';
        // 獲取URL訪問的ROOT地址
        echo 'root with domain:  ' . $request->root(true) . '<br/>';
        // 獲取URL地址中的PATH_INFO資訊
        echo 'pathinfo:  ' . $request->pathinfo() . '<br/>';
        // 獲取URL地址中的PATH_INFO資訊 不含字尾
        echo 'pathinfo:  ' . $request->path() . '<br/>';
        // 獲取URL地址中的字尾資訊
        echo 'ext: ' . $request->ext() . '<br/>';

         echo '路由資訊:';
         dump($request->route());
         //模組,控制器,方法
         echo '排程資訊:';
         dump($request->dispatch());
    }

響應物件

Response 物件用於動態響應客戶端請示,控制傳送給使用者的資訊,並將動態生成響應。通常用於輸出
資料給客戶端或者瀏覽器。

ThinkPHP5 的 Response 響應物件由 think\Response 類或者子類完成。

自動輸出

大多數情況,我們不需要關注 Response 物件本身,只需要在控制器的操作方法中返回資料即可,系統會根據 default_return_typedefault_ajax_return 配置決定響應輸出的型別。

預設的自動響應輸出會自動判斷是否 AJAX 請求,如果是的話會自動輸出default_ajax_return配置的
輸出型別。

預設的輸出型別為 Html

我們可以通過修改配置檔案改變預設的輸出型別。例如修改為輸出json

// 預設輸出型別
'default_return_type' => 'json',

手動輸出

在必要的時候,可以手動控制輸出型別和引數,這種方式較為靈活。如果需要指定輸出型別,可以通過下面的方式:

public function hello()
{
    $data = ['name' => 'thinkphp', 'status' => '1'];
    return json($data);
}

這樣的話無論配置引數如何, 都會輸出json格式的資料

預設的情況下發送的http狀態碼是 200 ,如果需要返回其它的狀態碼,可以使用:

public function hello()
{
    $data = ['name' => 'thinkphp', 'status' => '1'];
    return json($data, 201);
}

或者傳送更多的響應頭資訊:

public function hello()
{
    $data = ['name' => 'thinkphp', 'status' => '1'];
    return json($data, 201, ['Cache-control' => 'no-cache,must-revalidate']);
}

也支援使用下面的方式:

public function hello()
{
    $data = ['name' => 'thinkphp', 'status' => '1'];
    return json($data) -> code(201) -> header(['Cache-control' => 'no-cache,must-revalidate']);
}

預設支援的輸出型別

頁面跳轉

如果需要進行一些簡單的頁面操作提示或者重定向,可以引入 traits\controller\Jump ,就可以使用相關頁面跳轉和重定向方法,下面舉一個簡單的例子,當頁面傳入name引數為thinkphp的時候,跳轉到歡迎頁面,其它情況則跳轉到一個guest頁面。

如果你的控制器類是繼承的\think\Controller 的話,系統已經自動為你引入traits\controller\Jump,無需再次引入。

public function index($name='')
{
    if ('thinkphp' == $name) {
    $this->success('歡迎使用ThinkPHP5.0','hello');
} else {
    $this->error('錯誤的name','guest');
}

public function hello()
{
    return 'Hello,ThinkPHP!';
}

public function guest()
{
    return 'Hello,Guest!';
}

頁面重定向

//重定向頁面至百度   無需return
$this->redirect('http://baidu.com');

redirect 方法預設使用 302 跳轉,如不需要可以使用第二個引數進行301跳轉。
在任何時候(即使沒有引入Jump trait的話),我們可以使用系統提供的助手函式redirect函式進行重定向。

return redirect('http://baidu.com');

更多相關知識請參見[文章列表]
return redirect('http://baidu.com', 302);

更多相關知識請參見[文章列表]