概述

可以通過Request對象完成全局輸入變量的檢測、獲取和安全過濾,支持包括$_GET、$_POST、$_REQUEST、$_SERVER$_SESSION、$_COOKIE、$_ENV等系統(tǒng)變量,以及文件上傳信息。

檢測變量是否設(shè)置

可以使用has方法來檢測一個變量參數(shù)是否設(shè)置,如下:

Request::instance()->has('id','get');
Request::instance()->has('name','post');

或者使用助手函數(shù)

input('?get.id');
input('?post.name');

變量檢測可以支持所有支持的系統(tǒng)變量。

變量獲取

變量獲取使用 hinkRequest類的如下方法及參數(shù):

變量類型方法('變量名/變量修飾符','默認值','過濾方法')

變量類型方法包括:

方法 描述
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變量是框架提供的用于自動識別GETPOST或者PUT請求的一種變量獲取方式,是系統(tǒng)推薦的獲取請求參數(shù)的方法,用法如下:

// 獲取當前請求的name變量
Request::instance()->param('name');
// 獲取當前請求的所有變量(經(jīng)過過濾)
Request::instance()->param();
// 獲取當前請求的所有變量(原始數(shù)據(jù))
Request::instance()->param(false);
// 獲取當前請求的所有變量(包含上傳文件)
Request::instance()->param(true);

param方法會把當前請求類型的參數(shù)和PATH_INFO變量以及GET請求合并。

使用助手函數(shù)實現(xiàn):

input('param.name');
input('param.');
或者
input('name');
input('');

因為input函數(shù)默認就采用PARAM變量讀取方式。

獲取GET變量

Request::instance()->get('id'); // 獲取某個get變量
Request::instance()->get('name'); // 獲取get變量
Request::instance()->get(); // 獲取所有的get變量(經(jīng)過過濾的數(shù)組)
Request::instance()->get(false); // 獲取所有的get變量(原始數(shù)組)

或者使用內(nèi)置的助手函數(shù)input方法實現(xiàn)相同的功能:

input('get.id');
input('get.name');
input('get.');

注:pathinfo地址參數(shù)不能通過get方法獲取,查看“獲取PARAM變量”

獲取POST變量

Request::instance()->post('name'); // 獲取某個post變量
Request::instance()->post(); // 獲取經(jīng)過過濾的全部post變量
Request::instance()->post(false); // 獲取全部的post原始變量

使用助手函數(shù)實現(xiàn):

input('post.name');
input('post.');

獲取PUT變量

Request::instance()->put('name'); // 獲取某個put變量
Request::instance()->put(); // 獲取全部的put變量(經(jīng)過過濾)
Request::instance()->put(false); // 獲取全部的put原始變量

使用助手函數(shù)實現(xiàn):

input('put.name');
input('put.');

獲取REQUEST變量

Request::instance()->request('id'); // 獲取某個request變量
Request::instance()->request(); // 獲取全部的request變量(經(jīng)過過濾)
Request::instance()->request(false); // 獲取全部的request原始變量數(shù)據(jù)

使用助手函數(shù)實現(xiàn):

input('request.id');
input('request.');

獲取SERVER變量

Request::instance()->server('PHP_SELF'); // 獲取某個server變量
Request::instance()->server(); // 獲取全部的server變量

使用助手函數(shù)實現(xiàn):

input('server.PHP_SELF');
input('server.');

獲取SESSION變量

Request::instance()->session('user_id'); // 獲取某個session變量
Request::instance()->session(); // 獲取全部的session變量

使用助手函數(shù)實現(xiàn):

input('session.user_id');
input('session.');

獲取Cookie變量

Request::instance()->cookie('user_id'); // 獲取某個cookie變量
Request::instance()->cookie(); // 獲取全部的cookie變量

使用助手函數(shù)實現(xiàn):

input('cookie.user_id');
input('cookie.');

變量過濾

框架默認沒有設(shè)置任何過濾規(guī)則,你可以是配置文件中設(shè)置全局的過濾規(guī)則:

// 默認全局過濾方法 用逗號分隔多個
'default_filter'         => 'htmlspecialchars',

也支持使用Request對象進行全局變量的獲取過濾,過濾方式包括函數(shù)、方法過濾,以及PHP內(nèi)置的Types of filters,我們可以設(shè)置全局變量過濾方法,例如:

Request::instance()->filter('htmlspecialchars');

支持設(shè)置多個過濾方法,例如:

Request::instance()->filter(['strip_tags','htmlspecialchars']),

也可以在獲取變量的時候添加過濾方法,例如:

Request::instance()->get('name','','htmlspecialchars'); // 獲取get變量 并用htmlspecialchars函數(shù)過濾
Request::instance()->param('username','','strip_tags'); // 獲取param變量 并用strip_tags函數(shù)過濾
Request::instance()->post('name','','orgFilter::safeHtml'); // 獲取post變量 并用orgFilter類的safeHtml方法過濾

可以支持傳入多個過濾規(guī)則,例如:

Request::instance()->param('username','','strip_tags,strtolower'); // 獲取param變量 并依次調(diào)用strip_tags、strtolower函數(shù)過濾

Request對象還支持PHP內(nèi)置提供的Filter ID過濾,例如:

Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);

框架對FilterID做了轉(zhuǎn)換支持,因此也可以使用字符串的方式,例如:

Request::instance()->post('email','','email');

采用字符串方式定義FilterID的時候,系統(tǒng)會自動進行一次filter_id調(diào)用轉(zhuǎn)換成Filter常量。

具體的字符串根據(jù)filter_list函數(shù)的返回值來定義。

需要注意的是,采用Filter ID 進行過濾的話,如果不符合過濾要求的話 會返回false,因此你需要配合默認值來確保最終的值符合你的規(guī)范。

例如,

Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);

就表示,如果不是規(guī)范的email地址的話 返回空字符串。

如果當前不需要進行任何過濾的話,可以使用(V5.0.3+版本)

// 獲取get變量 并且不進行任何過濾 即使設(shè)置了全局過濾
Request::instance()->get('name','',null); 

獲取部分變量

如果你只需要獲取當前請求的部分參數(shù),可以使用:

// 只獲取當前請求的id和name變量
Request::instance()->only('id,name');

或者使用數(shù)組方式

// 只獲取當前請求的id和name變量
Request::instance()->only(['id','name']);

默認獲取的是當前請求參數(shù),如果需要獲取其它類型的參數(shù),可以使用第二個參數(shù),例如:

// 只獲取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');

或者使用數(shù)組方式

// 排除id和name變量
Request::instance()->except(['id','name']);

同樣支持指定變量類型獲?。?/p>

// 排除GET請求的id和name變量
Request::instance()->except(['id','name'],'get');
// 排除POST請求的id和name變量
Request::instance()->except(['id','name'],'post');

變量修飾符

input函數(shù)支持對變量使用修飾符功能,可以更好的過濾變量。

用法如下:

input('變量類型.變量名/修飾符');

或者

Request::instance()->變量類型('變量名/修飾符');

例如:

input('get.id/d');
input('post.name/s');
input('post.ids/a');
Request::instance()->get('id/d');

ThinkPHP5.0版本默認的變量修飾符是/s,如果需要傳入字符串之外的變量可以使用下面的修飾符,包括:

修飾符 作用
s 強制轉(zhuǎn)換為字符串類型
d 強制轉(zhuǎn)換為整型類型
b 強制轉(zhuǎn)換為布爾類型
a 強制轉(zhuǎn)換為數(shù)組類型
f 強制轉(zhuǎn)換為浮點類型

如果你要獲取的數(shù)據(jù)為數(shù)組,請一定注意要加上 /a 修飾符才能正確獲取到。