## 概述
可以通過`Request`對象完成全局輸入變量的檢測、獲取和安全過濾,支持包括`$_GET`、`$_POST`、`$_REQUEST`、`$_SERVER`、`$_SESSION`、`$_COOKIE`、`$_ENV`等系統變量,以及文件上傳信息。
## 檢測變量是否設置
可以使用`has`方法來檢測一個變量參數是否設置,如下:
~~~
Request::instance()->has('id','get');
Request::instance()->has('name','post');
~~~
或者使用助手函數
~~~
input('?get.id');
input('?post.name');
~~~
變量檢測可以支持所有支持的系統變量。
## 變量獲取
變量獲取使用`\think\Request`類的如下方法及參數:
> ### 變量類型方法('變量名/變量修飾符','默認值','過濾方法')
變量類型方法包括:
| 方法 | 描述 |
| --- | --- |
| param | 獲取當前請求的變量 |
| get | 獲取 $_GET 變量 |
| post | 獲取 $_POST 變量 |
| put | 獲取 PUT 變量 |
| delete | 獲取 DELETE 變量 |
| session | 獲取 $_SESSION 變量 |
| cookie | 獲取 $_COOKIE 變量 |
| request | 獲取 $_REQUEST 變量 |
| server | 獲取 $_SERVER 變量 |
| env | 獲取 $_ENV 變量 |
| route | 獲取 路由(包括PATHINFO) 變量 |
| file | 獲取 $_FILES 變量 |
### 獲取`PARAM`變量
PARAM變量是框架提供的用于自動識別`GET`、`POST`或者`PUT`請求的一種變量獲取方式,是系統推薦的獲取請求參數的方法,用法如下:
~~~
// 獲取當前請求的name變量
Request::instance()->param('name');
// 獲取當前請求的所有變量(經過過濾)
Request::instance()->param();
// 獲取當前請求的所有變量(原始數據)
Request::instance()->param(false);
// 獲取當前請求的所有變量(包含上傳文件)
Request::instance()->param(true);
~~~
> param方法會把當前請求類型的參數和PATH_INFO變量以及GET請求合并。
使用助手函數實現:
~~~
input('param.name');
input('param.');
或者
input('name');
input('');
~~~
因為`input`函數默認就采用PARAM變量讀取方式。
### 獲取`GET`變量
~~~
Request::instance()->get('id'); // 獲取某個get變量
Request::instance()->get('name'); // 獲取get變量
Request::instance()->get(); // 獲取所有的get變量(經過過濾的數組)
Request::instance()->get(false); // 獲取所有的get變量(原始數組)
~~~
或者使用內置的助手函數`input`方法實現相同的功能:
~~~
input('get.id');
input('get.name');
input('get.');
~~~
> 注:pathinfo地址參數不能通過get方法獲取,查看“獲取PARAM變量”
### 獲取`POST`變量
~~~
Request::instance()->post('name'); // 獲取某個post變量
Request::instance()->post(); // 獲取經過過濾的全部post變量
Request::instance()->post(false); // 獲取全部的post原始變量
~~~
使用助手函數實現:
~~~
input('post.name');
input('post.');
~~~
### 獲取`PUT`變量
~~~
Request::instance()->put('name'); // 獲取某個put變量
Request::instance()->put(); // 獲取全部的put變量(經過過濾)
Request::instance()->put(false); // 獲取全部的put原始變量
~~~
使用助手函數實現:
~~~
input('put.name');
input('put.');
~~~
### 獲取`REQUEST`變量
~~~
Request::instance()->request('id'); // 獲取某個request變量
Request::instance()->request(); // 獲取全部的request變量(經過過濾)
Request::instance()->request(false); // 獲取全部的request原始變量數據
~~~
使用助手函數實現:
~~~
input('request.id');
input('request.');
~~~
### 獲取`SERVER`變量
~~~
Request::instance()->server('PHP_SELF'); // 獲取某個server變量
Request::instance()->server(); // 獲取全部的server變量
~~~
使用助手函數實現:
~~~
input('server.PHP_SELF');
input('server.');
~~~
### 獲取`SESSION`變量
~~~
Request::instance()->session('user_id'); // 獲取某個session變量
Request::instance()->session(); // 獲取全部的session變量
~~~
使用助手函數實現:
~~~
input('session.user_id');
input('session.');
~~~
### 獲取`Cookie`變量
~~~
Request::instance()->cookie('user_id'); // 獲取某個cookie變量
Request::instance()->cookie(); // 獲取全部的cookie變量
~~~
使用助手函數實現:
~~~
input('cookie.user_id');
input('cookie.');
~~~
## 變量過濾
支持對獲取的變量進行過濾,過濾方式包括函數、方法過濾,以及PHP內置的Types of filters,我們可以設置全局變量過濾方法,例如:
~~~
Request::instance()->filter('htmlspecialchars');
~~~
支持設置多個過濾方法,例如:
~~~
Request::instance()->filter(['strip_tags','htmlspecialchars']),
~~~
也可以在獲取變量的時候添加過濾方法,例如:
~~~
Request::instance()->get('name','','htmlspecialchars'); // 獲取get變量 并用htmlspecialchars函數過濾
Request::instance()->param('username','','strip_tags'); // 獲取param變量 并用strip_tags函數過濾
Request::instance()->post('name','','org\Filter::safeHtml'); // 獲取post變量 并用org\Filter類的safeHtml方法過濾
~~~
可以支持傳入多個過濾規則,例如:
~~~
Request::instance()->param('username','','strip_tags,strtolower'); // 獲取param變量 并依次調用strip_tags、strtolower函數過濾
~~~
Request對象還支持PHP內置提供的Filter ID過濾,例如:
~~~
Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);
~~~
框架對FilterID做了轉換支持,因此也可以使用字符串的方式,例如:
~~~
Request::instance()->post('email','','email');
~~~
采用字符串方式定義`FilterID`的時候,系統會自動進行一次`filter_id`調用轉換成`Filter`常量。
具體的字符串根據`filter_list`函數的返回值來定義。
> 需要注意的是,采用Filter ID 進行過濾的話,如果不符合過濾要求的話 會返回false,因此你需要配合默認值來確保最終的值符合你的規范。
例如,
~~~
Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);
~~~
就表示,如果不是規范的email地址的話 返回空字符串。
如果希望和全局的過濾方法合并的話,可以使用
~~~
// 獲取get變量 并使用全局函數htmlspecialchars函數以及strtolower方法過濾
Request::instance()->get('name','','strtolower',true);
~~~
## 獲取部分變量
如果你只需要獲取當前請求的部分參數,可以使用:
~~~
// 只獲取當前請求的id和name變量
Request::instance()->only('id,name');
~~~
或者使用數組方式
~~~
// 只獲取當前請求的id和name變量
Request::instance()->only(['id','name']);
~~~
默認獲取的是當前請求參數,如果需要獲取其它類型的參數,可以使用第二個參數,例如:
~~~
// 只獲取GET請求的id和name變量
Request::instance()->only(['id','name'],'get');
// 只獲取POST請求的id和name變量
Request::instance()->only(['id','name'],'post');
~~~
## 排除部分變量
也支持排除某些變量獲取,例如
~~~
// 排除id和name變量
Request::instance()->except('id,name');
~~~
或者使用數組方式
~~~
// 排除id和name變量
Request::instance()->except(['id','name']);
~~~
同樣支持指定變量類型獲取:
~~~
// 排除GET請求的id和name變量
Request::instance()->except(['id','name'],'get');
// 排除POST請求的id和name變量
Request::instance()->except(['id','name'],'post');
~~~
## 變量修飾符
`input`函數支持對變量使用修飾符功能,可以更好的過濾變量。
用法如下:?
> ### input('變量類型.變量名/修飾符');
或者
> ### Request::instance()->變量類型('變量名/修飾符');
例如:
~~~
input('get.id/d');
input('post.name/s');
input('post.ids/a');
Request::instance()->get('id/d');
~~~
ThinkPHP5.0版本默認的變量修飾符是`/s`,如果需要傳入字符串之外的變量可以使用下面的修飾符,包括:
| 修飾符 | 作用 |
| --- | --- |
| s | 強制轉換為字符串類型 |
| d | 強制轉換為整型類型 |
| b | 強制轉換為布爾類型 |
| a | 強制轉換為數組類型 |
| f | 強制轉換為浮點類型 |
> 如果你要獲取的數據為數組,請一定注意要加上?`/a`?修飾符才能正確獲取到。
> 本節主要講解了如何獲取請求過來的數據,包括全局變量。
## 更改變量
如果需要更改請求變量的值,可以通過下面的方式:
~~~
// 更改GET變量
Request::instance()->get(['id'=>10]);
// 更改POST變量
Request::instance()->post(['name'=>'thinkphp']);
~~~
盡量避免直接修改`$_GET`?或者?`$_POST`數據,同時也不能直接修改`param`變量,例如下面的操作是無效的:
~~~
// 更改請求變量
Request::instance()->param(['id'=>10]);
~~~