概述
可以通過Request對象完成全局輸入變量的檢測、獲取和安全過濾,支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系統變量,以及文件上(shang)傳信息。
檢測變量是否設置
可以使用has方法來檢測一個變量(liang)參數是否設置,如(ru)下(xia):
Request::instance()->has('id','get');
Request::instance()->has('name','post');
或者(zhe)使用助手函數
input('?get.id');
input('?post.name');
變量(liang)檢測可以支(zhi)持所有支(zhi)持的系統變量(liang)。
變量獲取
變量獲取使用 hinkRequest類的(de)如下方(fang)法及參數:
變量類型方法('變量名/變量修飾符','默認值','過濾方法')
變量類型(xing)方法包括:
| 方法 | 描述 |
|---|---|
| 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請求的一種變量獲取方式,是系(xi)統推薦的獲取請求參(can)數的方法,用法如下(xia):
// 獲取當前請求的name變量
Request::instance()->param('name');
// 獲取當前請求的所有變量(liang)(經(jing)過過濾)
Request::instance()->param();
// 獲(huo)取當前請求的所有變量(原始數據)
Request::instance()->param(false);
// 獲取當前請求的所有變量(包含上傳文(wen)件)
Request::instance()->param(true);
param方法會(hui)把當前(qian)請求類(lei)型(xing)的參數和(he)PATH_INFO變(bian)量以及(ji)GET請求合并。
使用助手(shou)函數實現(xian):
input('param.name');
input('param.');
或者
input('name');
input('');
因為input函數(shu)默認就采用PARAM變量讀取(qu)方式。
獲取GET變量
Request::instance()->get('id'); // 獲(huo)取(qu)某個get變量
Request::instance()->get('name'); // 獲取get變(bian)量
Request::instance()->get(); // 獲取(qu)所有的get變(bian)量(經過過濾的數組)
Request::instance()->get(false); // 獲取所有的get變量(原始數組(zu))
或者使用內置的助手函數input方法實現相同的功能:
input('get.id');
input('get.name');
input('get.');
注:pathinfo地址參(can)數不能通過get方(fang)法獲(huo)取,查(cha)看“獲(huo)取PARAM變量”
獲取POST變量
Request::instance()->post('name'); // 獲取(qu)某個post變量
Request::instance()->post(); // 獲取(qu)經過過濾的全(quan)部post變量
Request::instance()->post(false); // 獲取全部的(de)post原始變量
使用助(zhu)手(shou)函數(shu)實現:
input('post.name');
input('post.');
獲取PUT變量
Request::instance()->put('name'); // 獲取某(mou)個put變量
Request::instance()->put(); // 獲取全部(bu)的put變量(經過過濾)
Request::instance()->put(false); // 獲取全部(bu)的put原(yuan)始變量(liang)
使用助手函數(shu)實現:
input('put.name');
input('put.');
獲取REQUEST變量
Request::instance()->request('id'); // 獲(huo)取某個request變量(liang)
Request::instance()->request(); // 獲取全部的request變(bian)量(經過過濾(lv))
Request::instance()->request(false); // 獲(huo)取全部的request原(yuan)始變量數據
使用助(zhu)手(shou)函數實(shi)現:
input('request.id');
input('request.');
獲取SERVER變量
Request::instance()->server('PHP_SELF'); // 獲取某個(ge)server變(bian)量(liang)
Request::instance()->server(); // 獲取全部的server變量
使用(yong)助手函數實現:
input('server.PHP_SELF');
input('server.');
獲取SESSION變量
Request::instance()->session('user_id'); // 獲取某個(ge)session變量
Request::instance()->session(); // 獲取全部的session變量
使用助手函數實(shi)現:
input('session.user_id');
input('session.');
獲取Cookie變量
Request::instance()->cookie('user_id'); // 獲(huo)取某(mou)個cookie變量
Request::instance()->cookie(); // 獲取全部的cookie變量(liang)
使(shi)用(yong)助手函數(shu)實現(xian):
input('cookie.user_id');
input('cookie.');
變量過濾
框架默(mo)認(ren)沒有設置(zhi)(zhi)任何過(guo)濾(lv)(lv)規則(ze),你可以(yi)是配置(zhi)(zhi)文件中設置(zhi)(zhi)全局的(de)過(guo)濾(lv)(lv)規則(ze):
// 默認(ren)全局過濾(lv)方法 用逗號分隔多個
'default_filter' => 'htmlspecialchars',
也支持使用Request對象(xiang)進行全(quan)局變(bian)量的獲取過濾(lv),過濾(lv)方式包括函(han)數(shu)、方法過濾(lv),以及(ji)PHP內置(zhi)的Types of filters,我們可以設置(zhi)全(quan)局變(bian)量過濾(lv)方法,例如:
Request::instance()->filter('htmlspecialchars');
支持設(she)置(zhi)多個過濾方法,例(li)如:
Request::instance()->filter(['strip_tags','htmlspecialchars']),
也可以在獲(huo)取變(bian)量的時候添加過(guo)濾方法,例如(ru):
Request::instance()->get('name','','htmlspecialchars'); // 獲取get變(bian)量 并用htmlspecialchars函(han)數過濾
Request::instance()->param('username','','strip_tags'); // 獲取(qu)param變量 并用strip_tags函數過濾(lv)
Request::instance()->post('name','','orgFilter::safeHtml'); // 獲(huo)取post變(bian)量 并(bing)用orgFilter類的(de)safeHtml方法過濾
可(ke)以(yi)支持傳入多個過濾規(gui)則,例如:
Request::instance()->param('username','','strip_tags,strtolower'); // 獲取param變量 并依次調用strip_tags、strtolower函數過濾
Request對象還(huan)支持PHP內置提(ti)供的Filter ID過濾,例如:
Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);
框架對FilterID做了(le)轉換支持,因此也可以使用字符(fu)串的方式,例(li)如:
Request::instance()->post('email','','email');
采用字符串方式定義FilterID的時候,系統會自動進行一次filter_id調用轉換成Filter常量。
具體的字符串根據filter_list函(han)數(shu)的返回值來定義(yi)。
需(xu)要(yao)(yao)注意的(de)是,采用Filter ID 進行過(guo)濾(lv)的(de)話,如(ru)果不符合過(guo)濾(lv)要(yao)(yao)求的(de)話 會(hui)返回false,因此你需(xu)要(yao)(yao)配合默(mo)認值來確保最(zui)終的(de)值符合你的(de)規范。
例如,
Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);
就表示(shi),如果不是規范的email地址的話 返回空(kong)字符串。
如果當前不需要進行任何過濾的話,可以使用(V5.0.3+版本)
// 獲取get變量 并且不進行任何(he)過濾(lv) 即(ji)使設置了全局過濾(lv)
Request::instance()->get('name','',null);
獲取部分變量
如果你(ni)只(zhi)需要獲取當(dang)前請求(qiu)的(de)部分參數,可以使(shi)用:
// 只獲(huo)取(qu)當前請求的id和(he)name變量
Request::instance()->only('id,name');
或者使(shi)用數組方式(shi)
// 只獲取當前(qian)請求的id和name變量
Request::instance()->only(['id','name']);
默(mo)認獲取的(de)是(shi)當前請求(qiu)參數,如果需(xu)要(yao)獲取其它類(lei)型的(de)參數,可以使用第二個參數,例如:
// 只(zhi)獲取GET請(qing)求(qiu)的id和name變量
Request::instance()->only(['id','name'],'get');
// 只(zhi)獲取POST請求的id和name變量
Request::instance()->only(['id','name'],'post');
排除部分變量
也支(zhi)持排除某(mou)些變量獲(huo)取,例如
// 排除(chu)id和name變量(liang)
Request::instance()->except('id,name');
或者使(shi)用數組方式
// 排除id和name變量
Request::instance()->except(['id','name']);
同樣支持指定變(bian)量類(lei)型(xing)獲取:
// 排除GET請求(qiu)的id和(he)name變量
Request::instance()->except(['id','name'],'get');
// 排除POST請(qing)求(qiu)的id和name變量(liang)
Request::instance()->except(['id','name'],'post');
變量修飾符
input函數(shu)支持對(dui)變量(liang)使(shi)用(yong)修飾符功(gong)能,可以更好的過濾變量(liang)。
用法如下:
input('變量類型.變量名/修飾符');
或者
Request::instance()->變量類型('變量名/修飾符');
例如:
input('get.id/d');
input('post.name/s');
input('post.ids/a');
Request::instance()->get('id/d');
ThinkPHP5.0版本默認的變量修飾符是/s,如(ru)果需要傳入(ru)字符(fu)(fu)串之外的變量可以(yi)使用下面的修(xiu)飾符(fu)(fu),包括:
| 修飾符 | 作用 |
|---|---|
| s | 強制轉換為字符串類型 |
| d | 強制轉換為整型類型 |
| b | 強制轉換為布爾類型 |
| a | 強制轉換為數組類型 |
| f | 強制轉換為浮點類型 |
如果你要獲取的數據為數組,請一定注意要加上
/a修飾符才(cai)能正確獲取到。
