# 快速入門(三):請求和響應
本章主要了解如何獲取當前的請求信息,以及進行不同的輸出響應、跳轉和頁面重定向,主要內容包括:
- - [請求對象](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u8BF7u6C42u5BF9u8C61)
- [傳統方式調用](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u4F20u7EDFu65B9u5F0Fu8C03u7528)
- [繼承think\\Controller](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#-think-controller)
- [自動注入請求對象](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u81EAu52A8u6CE8u5165u8BF7u6C42u5BF9u8C61)
- [動態綁定屬性](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u52A8u6001u7ED1u5B9Au5C5Eu6027)
- [使用助手函數](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u4F7Fu7528u52A9u624Bu51FDu6570)
- [請求信息](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u8BF7u6C42u4FE1u606F)
- [獲取請求變量](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u83B7u53D6u8BF7u6C42u53D8u91CF)
- [獲取請求參數](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u83B7u53D6u8BF7u6C42u53C2u6570)
- [獲取URL信息](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#-url-)
- [獲取當前模塊/控制器/操作信息](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#--3)
- [獲取路由和調度信息](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u83B7u53D6u8DEFu7531u548Cu8C03u5EA6u4FE1u606F)
- [響應對象](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u54CDu5E94u5BF9u8C61)
- [自動輸出](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u81EAu52A8u8F93u51FA)
- [手動輸出](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u624Bu52A8u8F93u51FA)
- [頁面跳轉](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u9875u9762u8DF3u8F6C)
- [頁面重定向](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u9875u9762u91CDu5B9Au5411)
- [總結](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145255#u603Bu7ED3)
`ThinkPHP5`的架構設計和之前版本的主要區別之一就在于增加了`Request`請求對象和`Response`響應對象的概念,了解了這兩個對象的作用和用法對你的應用開發非常關鍵。
## 請求對象
> `Request`對象的作用是與客戶端交互,收集客戶端的Form、Cookies、超鏈接,或者收集服務器端的環境變量。
>
> Request對象是從客戶端向服務器發出請求,包括用戶提交的信息以及客戶端的一些信息。客戶端可通過HTML表單或在網頁地址后面提供參數的方法提交數據,然后通過Request對象的相關方法來獲取這些數據。Request的各種方法主要用來處理客戶端瀏覽器提交的請求中的各項參數和選項。
`ThinkPHP5`的`Request`對象由`think\Request`類完成。
`Request`對象的一個主要職責是統一和更安全地獲取當前的請求信息,你需要避免直接操作`$_GET`、`$_POST`、`$_REQUEST`、`$_SESSION`、`$_COOKIE`,甚至`$_FILES`等全局變量,而是統一使用`Request`對象提供的方法來獲取請求變量。
下面來舉一個最簡單的例子(獲取當前訪問的url地址)來說明在不同的情況下如何調用`Request`對象。
### 傳統方式調用
該用法主要是用來告訴大家`Request`對象是如何實例化的,因為實際開發中很少選擇這種方式調用。
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(<span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-regexp">$request</span> = Request::instance();
<span class="hljs-comment">// 獲取當前URL地址 不含域名</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url: '</span> . <span class="hljs-regexp">$request</span>->url() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
訪問下面的URL地址:
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello.html?name=thinkphp
```
```
頁面輸出結果為:
```
<pre class="calibre18">
```
<span class="hljs-regexp">url</span>: <span class="hljs-string">/index/index/hello.html?name=thinkphp</span><span class="hljs-regexp">Hello,thinkphp!</span>
```
```
### 繼承think\\Controller
如果控制器類繼承了`think\Controller`的話,可以做如下簡化調用:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(<span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-comment">// 獲取當前URL地址 不含域名</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url: '</span> . <span class="hljs-regexp">$this</span>->request->url() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
### 自動注入請求對象
如果沒有繼承`think\Controller`,則可以使用`Request`對象注入的方式來簡化調用:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>, <span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-comment">// 獲取當前URL地址 不含域名</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url: '</span> . <span class="hljs-regexp">$request</span>->url() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
> #### 提示:
>
> - - - - - -
>
> hello方法的request參數是系統自動注入的,而不需要通過URL請求傳入。
### 動態綁定屬性
可以給Request請求對象綁定屬性,方便全局調用,例如我們可以在公共控制器中綁定當前登錄的用戶模型到請求對象:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Session</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Base</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_initialize</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$user</span> = User::get(Session::get(<span class="hljs-string">'user_id'</span>));
Request::instance()->bind(<span class="hljs-string">'user'</span>,<span class="hljs-regexp">$user</span>);
}
}</span>
```
```
然后,在其它的控制器中就可以直接使用
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>\<span class="hljs-title">Base</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Base</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$request</span>->user->id;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$request</span>->user->name;
}
}</span>
```
```
### 使用助手函數
如果既沒有繼承`think\Controller`也不想給操作方法添加額外的`Request`對象參數,那么也可以使用系統提供的助手,例如:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(<span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-comment">// 獲取當前URL地址 不含域名</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url: '</span> . request()->url() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
上面任意一種方式都可以調用當前請求的`Request`對象實例,然后通過請求對象實例的方法來完成不同的信息獲取或者設置。
> 在后面的示例中,如果沒有特別說明,我們均以第三種方式,自動注入請求對象的方式來講解,請注意根據自己的調用方式靈活運用。
## 請求信息
我們來陸續了解下請求對象的常用方法。
### 獲取請求變量
系統推薦使用`param`方法統一獲取當前請求變量,該方法最大的優勢是讓你不需要區分當前請求類型而使用不同的全局變量或者方法,并且可以滿足大部分的參數需求,下面舉一個例子。
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'請求參數:'</span>;
dump(<span class="hljs-regexp">$request</span>->param());
<span class="hljs-keyword">echo</span> <span class="hljs-string">'name:'</span>.<span class="hljs-regexp">$request</span>->param(<span class="hljs-string">'name'</span>);
}
}</span>
```
```
訪問下面的URL地址:
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello.html?test=ddd&name=thinkphp
```
```
頁面輸出結果為:
```
<pre class="calibre18">
```
請求參數:
<span class="hljs-keyword">array</span> (size=<span class="hljs-number">2</span>)
<span class="hljs-string">'test'</span> => string <span class="hljs-string">'ddd'</span> (length=<span class="hljs-number">3</span>)
<span class="hljs-string">'name'</span> => string <span class="hljs-string">'thinkphp'</span> (length=<span class="hljs-number">8</span>)
name:thinkphp
```
```
系統提供了一個input助手函數來簡化`Request`對象的param方法,用法如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'請求參數:'</span>;
dump(input());
<span class="hljs-keyword">echo</span> <span class="hljs-string">'name:'</span>.input(<span class="hljs-string">'name'</span>);
}
}</span>
```
```
`param`方法獲取的參數會自動判斷當前的請求,以`POST`請求為例的話,參數的優先級別為:
#### 路由變量 > 當前請求變量($\_POST變量) > $\_GET變量
> #### 注意:
>
> - - - - - -
>
> 這里的路由變量指的是路由規則里面定義的變量或者`PATH_INFO`地址中的變量。路由變量無法使用`get`方法或者`$_GET`變量獲取。
`param`方法支持變量的過濾和默認值,例如:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'name:'</span>.<span class="hljs-regexp">$request</span>->param(<span class="hljs-string">'name'</span>,<span class="hljs-string">'World'</span>,<span class="hljs-string">'strtolower'</span>);
<span class="hljs-keyword">echo</span> <span class="hljs-string">'<br/>test:'</span>.<span class="hljs-regexp">$request</span>->param(<span class="hljs-string">'test'</span>,<span class="hljs-string">'thinkphp'</span>,<span class="hljs-string">'strtoupper'</span>);
}
}</span>
```
```
訪問下面的URL地址:
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello.html?test=ddd&name=thinkphp
```
```
頁面輸出結果為:
```
<pre class="calibre18">
```
<span class="hljs-string">name:</span>thinkphp
<span class="hljs-string">test:</span>DDD
```
```
可以設置全局的過濾方法,如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 設置默認的全局過濾規則 多個用數組或者逗號分隔</span><span class="hljs-string">'default_filter'</span> => <span class="hljs-string">'htmlspecialchars '</span>,
```
```
除了`Param`方法之外,`Request`對象也可以用于獲取其它的輸入參數,例如:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'GET參數:'</span>;
dump(<span class="hljs-regexp">$request</span>->get());
<span class="hljs-keyword">echo</span> <span class="hljs-string">'GET參數:name'</span>;
dump(<span class="hljs-regexp">$request</span>->get(<span class="hljs-string">'name'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'POST參數:name'</span>;
dump(<span class="hljs-regexp">$request</span>->post(<span class="hljs-string">'name'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'cookie參數:name'</span>;
dump(<span class="hljs-regexp">$request</span>->cookie(<span class="hljs-string">'name'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'上傳文件信息:image'</span>;
dump(<span class="hljs-regexp">$request</span>->file(<span class="hljs-string">'image'</span>));
}
}</span>
```
```
頁面輸出的結果為:
```
<pre class="calibre18">
```
GET參數:
array (size=<span class="hljs-number">1</span>)
<span class="hljs-string">'name'</span> => <span class="hljs-keyword">string</span> <span class="hljs-string">'thinkphp'</span> (length=<span class="hljs-number">8</span>)
GET參數:name
<span class="hljs-keyword">string</span> <span class="hljs-string">'thinkphp'</span> (length=<span class="hljs-number">8</span>)
POST參數:name
<span class="hljs-keyword">null</span>
當前請求(自動識別請求類型)的參數:name
<span class="hljs-keyword">string</span> <span class="hljs-string">'thinkphp'</span> (length=<span class="hljs-number">8</span>)
cookie參數:name
<span class="hljs-keyword">null</span>
上傳文件信息:image
<span class="hljs-keyword">null</span>
```
```
使用助手函數的代碼為:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'GET參數:'</span>;
dump(input(<span class="hljs-string">'get.'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'GET參數:name'</span>;
dump(input(<span class="hljs-string">'get.name'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'POST參數:name'</span>;
dump(input(<span class="hljs-string">'post.name'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'cookie參數:name'</span>;
dump(input(<span class="hljs-string">'cookie.name'</span>));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'上傳文件信息:image'</span>;
dump(input(<span class="hljs-string">'file.image'</span>));
}
}</span>
```
```
獲取變量的方法包括:
方法 作用 param 獲取請求變量 get 獲取$\_GET變量 post 獲取$\_POST變量 put 獲取PUT請求變量 delete 獲取DELETE請求變量 patch 獲取PATCH請求變量 request 獲取$\_REQUEST變量 route 獲取路由(URL)變量 session 獲取$\_SESSION變量 cookie 獲取$\_COOKIE變量 server 獲取$\_SERVER變量 env 獲取$\_ENV變量 file 獲取上傳文件信息> 除了file方法之外,其它方法都支持默認值和過濾方法。
### 獲取請求參數
把`Hello`方法改為如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'請求方法:'</span> . <span class="hljs-regexp">$request</span>->method() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-string">'資源類型:'</span> . <span class="hljs-regexp">$request</span>->type() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-string">'訪問IP:'</span> . <span class="hljs-regexp">$request</span>->ip() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-string">'是否AJax請求:'</span> . var_export(<span class="hljs-regexp">$request</span>->isAjax(), <span class="hljs-keyword">true</span>) . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-string">'請求參數:'</span>;
dump(<span class="hljs-regexp">$request</span>->param());
<span class="hljs-keyword">echo</span> <span class="hljs-string">'請求參數:僅包含name'</span>;
dump(<span class="hljs-regexp">$request</span>->only([<span class="hljs-string">'name'</span>]));
<span class="hljs-keyword">echo</span> <span class="hljs-string">'請求參數:排除name'</span>;
dump(<span class="hljs-regexp">$request</span>->except([<span class="hljs-string">'name'</span>]));
}
}</span>
```
```
訪問下面的URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>/<span class="hljs-regexp">/tp5.com/index</span><span class="hljs-regexp">/index/hello</span><span class="hljs-regexp">/test/ddd</span>.html?name=thinkphp
```
```
頁面輸出結果為:
```
<pre class="calibre18">
```
請求方法:GET
資源類型:html
訪問地址:127.0.<span class="hljs-operator">0.<span class="hljs-number">1</span>
是否AJax請求:<span class="hljs-number">false</span>
請求參數:
<span class="hljs-number">array</span> (<span class="hljs-keyword">size</span>=<span class="hljs-number">2</span>)
<span class="hljs-string">'test'</span> => <span class="hljs-keyword">string</span> <span class="hljs-string">'ddd'</span> (<span class="hljs-keyword">length</span>=<span class="hljs-number">3</span>)
<span class="hljs-string">'name'</span> => <span class="hljs-keyword">string</span> <span class="hljs-string">'thinkphp'</span> (<span class="hljs-keyword">length</span>=<span class="hljs-number">8</span>)
請求參數:僅包含<span class="hljs-keyword">name</span><span class="hljs-number">array</span> (<span class="hljs-keyword">size</span>=<span class="hljs-number">1</span>)
<span class="hljs-string">'name'</span> => <span class="hljs-keyword">string</span> <span class="hljs-string">'thinkphp'</span> (<span class="hljs-keyword">length</span>=<span class="hljs-number">8</span>)
請求參數:排除<span class="hljs-keyword">name</span><span class="hljs-number">array</span> (<span class="hljs-keyword">size</span>=<span class="hljs-number">1</span>)
<span class="hljs-string">'test'</span> => <span class="hljs-keyword">string</span> <span class="hljs-string">'ddd'</span> (<span class="hljs-keyword">length</span>=<span class="hljs-number">3</span>)</span>
```
```
### 獲取URL信息
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>,<span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-comment">// 獲取當前域名</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'domain: '</span> . <span class="hljs-regexp">$request</span>->domain() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取當前入口文件</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'file: '</span> . <span class="hljs-regexp">$request</span>->baseFile() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取當前URL地址 不含域名</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url: '</span> . <span class="hljs-regexp">$request</span>->url() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取包含域名的完整URL地址</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url with domain: '</span> . <span class="hljs-regexp">$request</span>->url(<span class="hljs-keyword">true</span>) . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取當前URL地址 不含QUERY_STRING</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'url without query: '</span> . <span class="hljs-regexp">$request</span>->baseUrl() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取URL訪問的ROOT地址</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'root:'</span> . <span class="hljs-regexp">$request</span>->root() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取URL訪問的ROOT地址</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'root with domain: '</span> . <span class="hljs-regexp">$request</span>->root(<span class="hljs-keyword">true</span>) . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取URL地址中的PATH_INFO信息</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'pathinfo: '</span> . <span class="hljs-regexp">$request</span>->pathinfo() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取URL地址中的PATH_INFO信息 不含后綴</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'pathinfo: '</span> . <span class="hljs-regexp">$request</span>->path() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-comment">// 獲取URL地址中的后綴信息</span><span class="hljs-keyword">echo</span> <span class="hljs-string">'ext: '</span> . <span class="hljs-regexp">$request</span>->ext() . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
訪問下面的URL地址:
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello.html?name=thinkphp
```
```
頁面輸出結果為:
```
<pre class="calibre18">
```
<span class="hljs-string">domain:</span> <span class="hljs-string">http:</span><span class="hljs-comment">//tp5.com</span><span class="hljs-string">file:</span> /index.php
<span class="hljs-string">url:</span> <span class="hljs-regexp">/index/</span>index/hello.html?name=thinkphp
url with domain: <span class="hljs-string">http:</span><span class="hljs-comment">//tp5.com/index/index/hello.html?name=thinkphp</span>
url without <span class="hljs-string">query:</span> <span class="hljs-regexp">/index/</span>index/hello.html
<span class="hljs-string">root:</span>
root with <span class="hljs-string">domain:</span> <span class="hljs-string">http:</span><span class="hljs-comment">//tp5.com</span><span class="hljs-string">pathinfo:</span> index<span class="hljs-regexp">/index/</span>hello.html
<span class="hljs-string">pathinfo:</span> index<span class="hljs-regexp">/index/</span>hello
<span class="hljs-string">ext:</span> html
Hello,thinkphp!
```
```
URL請求和信息方法可以總結如下:
方法 作用 domain 獲取當前的域名 url 獲取當前的完整URL地址 baseUrl 獲取當前的URL地址,不含QUERY\_STRING baseFile 獲取當前的SCRIPT\_NAME root 獲取當前URL的root地址 pathinfo 獲取當前URL的pathinfo地址 path 獲取當前URL的pathinfo地址,不含后綴 ext 獲取當前URL的后綴 type 獲取當前請求的資源類型 scheme 獲取當前請求的scheme query 獲取當前URL地址的QUERY\_STRING host 獲取當前URL的host地址 port 獲取當前URL的port號 protocol 獲取當前請求的SERVER\_PROTOCOL remotePort 獲取當前請求的REMOTE\_PORT> url、baseUrl、baseFile、root方法如果傳入true,表示獲取包含域名的地址。
### 獲取當前模塊/控制器/操作信息
hello方法修改如下:
```
<pre class="calibre18">
```
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>, <span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'模塊:'</span>.<span class="hljs-regexp">$request</span>->module();
<span class="hljs-keyword">echo</span> <span class="hljs-string">'<br/>控制器:'</span>.<span class="hljs-regexp">$request</span>->controller();
<span class="hljs-keyword">echo</span> <span class="hljs-string">'<br/>操作:'</span>.<span class="hljs-regexp">$request</span>->action();
}
```
```
訪問URL地址:
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello.html?test=ddd&name=thinkphp
```
```
頁面會顯示:
```
<pre class="calibre18">
```
模塊:<span class="hljs-keyword">index</span>
控制器:<span class="hljs-keyword">Index</span>
操作:hello
```
```
> controller方法獲取的是駝峰命名的實際的控制器名,其它都是小寫返回。
### 獲取路由和調度信息
hello方法修改如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>, <span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-keyword">echo</span> <span class="hljs-string">'路由信息:'</span>;
dump(<span class="hljs-regexp">$request</span>->routeInfo());
<span class="hljs-keyword">echo</span> <span class="hljs-string">'調度信息:'</span>;
dump(<span class="hljs-regexp">$request</span>->dispatch());
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
然后在配置文件中添加路由定義為:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> [
<span class="hljs-string">'hello/:name'</span> =>[<span class="hljs-string">'index/hello'</span>,[],[<span class="hljs-string">'name'</span>=><span class="hljs-string">'\w+'</span>]],
];
```
```
訪問下面的URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/hello/thinkphp</span>
```
```
頁面輸出信息為:
```
<pre class="calibre18">
```
路由信息:
<span class="hljs-keyword">array</span> (size=<span class="hljs-number">4</span>)
<span class="hljs-string">'rule'</span> => string <span class="hljs-string">'hello/:name'</span> (length=<span class="hljs-number">11</span>)
<span class="hljs-string">'route'</span> => string <span class="hljs-string">'index/hello'</span> (length=<span class="hljs-number">11</span>)
<span class="hljs-string">'pattern'</span> =>
<span class="hljs-keyword">array</span> (size=<span class="hljs-number">1</span>)
<span class="hljs-string">'name'</span> => string <span class="hljs-string">'\w+'</span> (length=<span class="hljs-number">3</span>)
<span class="hljs-string">'option'</span> =>
<span class="hljs-keyword">array</span> (size=<span class="hljs-number">0</span>)
<span class="hljs-keyword">empty</span>
調度信息:
<span class="hljs-keyword">array</span> (size=<span class="hljs-number">2</span>)
<span class="hljs-string">'type'</span> => string <span class="hljs-string">'module'</span> (length=<span class="hljs-number">6</span>)
<span class="hljs-string">'module'</span> =>
<span class="hljs-keyword">array</span> (size=<span class="hljs-number">3</span>)
<span class="hljs-number">0</span> => <span class="hljs-keyword">null</span><span class="hljs-number">1</span> => string <span class="hljs-string">'index'</span> (length=<span class="hljs-number">5</span>)
<span class="hljs-number">2</span> => string <span class="hljs-string">'hello'</span> (length=<span class="hljs-number">5</span>)
Hello,thinkphp!
```
```
## 響應對象
> `Response`對象用于動態響應客戶端請示,控制發送給用戶的信息,并將動態生成響應。通常用于輸出數據給客戶端或者瀏覽器。
`ThinkPHP5`的`Response`響應對象由`think\Response`類或者子類完成,下面介紹下基本的用法。
### 自動輸出
大多數情況,我們不需要關注`Response`對象本身,只需要在控制器的操作方法中返回數據即可,系統會根據`default_return_type`和`default_ajax_return`配置決定響應輸出的類型。
默認的自動響應輸出會自動判斷是否`AJAX`請求,如果是的話會自動輸出`default_ajax_return`配置的輸出類型。
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = [<span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-string">'1'</span>];
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$data</span>;
}
}</span>
```
```
由于默認是輸出`Html`輸出,所以訪問頁面輸出結果為:

修改配置文件,添加:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 默認輸出類型</span><span class="hljs-string">'default_return_type'</span> => <span class="hljs-string">'json'</span>,
```
```
再次訪問的輸出結果為:
```
<pre class="calibre18">
```
{"<span class="hljs-regexp">name</span>":<span class="hljs-string"><span class="hljs-operator">"thinkphp"</span></span>,"<span class="hljs-regexp">status</span>":<span class="hljs-string"><span class="hljs-operator">"1"</span></span>}
```
```
修改輸出類型為xml:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 默認輸出類型</span><span class="hljs-string">'default_return_type'</span> => <span class="hljs-string">'xml'</span>,
```
```
則輸出結果變成:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">think</span>></span><span class="hljs-regexp"><<span class="hljs-operator">name</span>></span>thinkphp<span class="hljs-regexp"></<span class="hljs-operator">name</span>></span><span class="hljs-regexp"><<span class="hljs-operator">status</span>></span>1<span class="hljs-regexp"></<span class="hljs-operator">status</span>></span><span class="hljs-regexp"></<span class="hljs-operator">think</span>></span>
```
```
### 手動輸出
在必要的時候,可以手動控制輸出類型和參數,這種方式較為靈活。如果需要指定輸出類型,可以通過下面的方式:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = [<span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-string">'1'</span>];
<span class="hljs-keyword">return</span> json(<span class="hljs-regexp">$data</span>);
}
}</span>
```
```
無論配置參數如何設置,頁面輸出的結果為:
```
<pre class="calibre18">
```
{"<span class="hljs-regexp">name</span>":<span class="hljs-string"><span class="hljs-operator">"thinkphp"</span></span>,"<span class="hljs-regexp">status</span>":<span class="hljs-string"><span class="hljs-operator">"1"</span></span>}
```
```
默認的情況下發送的http狀態碼是`200`,如果需要返回其它的狀態碼,可以使用:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = [<span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-string">'1'</span>];
<span class="hljs-keyword">return</span> json(<span class="hljs-regexp">$data</span>, <span class="hljs-number">201</span>);
}
}</span>
```
```
或者發送更多的響應頭信息:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = [<span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-string">'1'</span>];
<span class="hljs-keyword">return</span> json(<span class="hljs-regexp">$data</span>, <span class="hljs-number">201</span>, [<span class="hljs-string">'Cache-control'</span> => <span class="hljs-string">'no-cache,must-revalidate'</span>]);
}
}</span>
```
```
也支持使用下面的方式:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = [<span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-string">'1'</span>];
<span class="hljs-keyword">return</span> json(<span class="hljs-regexp">$data</span>)->code(<span class="hljs-number">201</span>)->header([<span class="hljs-string">'Cache-control'</span> => <span class="hljs-string">'no-cache,must-revalidate'</span>]);
}
}</span>
```
```
默認支持的輸出類型包括:
輸出類型 快捷方法 渲染模板輸出 view JSON輸出 json JSONP輸出 jsonp XML輸出 xml 頁面重定向 redirect所以,同樣的可以使用`xml`方法輸出`XML`數據類型:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = [<span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-string">'1'</span>];
<span class="hljs-keyword">return</span> xml(<span class="hljs-regexp">$data</span>, <span class="hljs-number">201</span>);
}
}</span>
```
```
### 頁面跳轉
如果需要進行一些簡單的頁面操作提示或者重定向,可以引入`traits\controller\Jump`,就可以使用相關頁面跳轉和重定向方法,下面舉一個簡單的例子,當頁面傳入name參數為thinkphp的時候,跳轉到歡迎頁面,其它情況則跳轉到一個guest頁面。
```
<pre class="calibre18">
```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">use</span> \<span class="hljs-title">traits</span>\<span class="hljs-title">controller</span>\<span class="hljs-title">Jump</span>;
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">(<span class="hljs-regexp">$name</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-keyword">if</span> (<span class="hljs-string">'thinkphp'</span> == <span class="hljs-regexp">$name</span>) {
<span class="hljs-regexp">$this</span>->success(<span class="hljs-string">'歡迎使用ThinkPHP
5.0'</span>,<span class="hljs-string">'hello'</span>);
} <span class="hljs-keyword">else</span> {
<span class="hljs-regexp">$this</span>->error(<span class="hljs-string">'錯誤的name'</span>,<span class="hljs-string">'guest'</span>);
}
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,ThinkPHP!'</span>;
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">guest</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,Guest!'</span>;
}
}
```
```
> 這里我們使用
>
> ```
> <pre class="calibre25">
> ```
>
> <span class="hljs-operator"><span class="hljs-keyword">use</span> \traits\controller\Jump;</span>
>
> ```
>
> ```
>
> 引入了一個`Jump` trait,這是`PHP5.4`版本的新特性,如果你的控制器類是繼承的`\think\Controller`的話,系統已經自動為你引入了 `\traits\controller\Jump`,無需再次引入。
當我們訪問
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com</span>
```
```
頁面顯示如圖所示:

然后顯示 `Hello,Guest!`。
如果訪問URL地址為:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com?name=thinkphp</span>
```
```
則頁面顯示如圖所示:

然后顯示 `Hello,ThinkPHP!`。
### 頁面重定向
如果要進行頁面重定向跳轉,可以使用:
```
<pre class="calibre18">
```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">use</span> \<span class="hljs-title">traits</span>\<span class="hljs-title">controller</span>\<span class="hljs-title">Jump</span>;
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">(<span class="hljs-regexp">$name</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-keyword">if</span> (<span class="hljs-string">'thinkphp'</span> == <span class="hljs-regexp">$name</span>) {
<span class="hljs-regexp">$this</span>->redirect(<span class="hljs-string">'http://thinkphp.cn'</span>);
} <span class="hljs-keyword">else</span> {
<span class="hljs-regexp">$this</span>->success(<span class="hljs-string">'歡迎使用ThinkPHP'</span>,<span class="hljs-string">'hello'</span>);
}
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,ThinkPHP!'</span>;
}
}
```
```
當我們再次訪問
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com?name=thinkphp</span>
```
```
就會重定向到ThinkPHP官網 `http://thinkphp.cn`
> `redirect`方法默認使用`302`跳轉,如不需要可以使用第二個參數進行301跳轉。
```
<pre class="calibre18">
```
$<span class="hljs-keyword">this</span>->redirect(<span class="hljs-operator">'http</span>:<span class="hljs-comment">//thinkphp.cn',301);</span>
```
```
在任何時候(即使沒有引入Jump trait的話),我們可以使用系統提供的助手函數redirect函數進行重定向。
```
<pre class="calibre18">
```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">(<span class="hljs-regexp">$name</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-keyword">if</span> (<span class="hljs-string">'thinkphp'</span> == <span class="hljs-regexp">$name</span>) {
<span class="hljs-keyword">return</span> redirect(<span class="hljs-string">'http://thinkphp.cn'</span>);
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,ThinkPHP!'</span>;
}
}
}
```
```
## 總結
本章我們了解了`Request`請求對象和`Response`響應對象的基本用法,以及如何更輕松的獲取請求變量。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝