#### 請求變量
ThinkPHP5使用了請求對象(由think\Request類實現)來記錄當前請求的相關信息和執行相關操作,而獲取請求變量是請求對象的一個重要用途。
例如,在原生PHP開發中經常會被使用的 $_GET、$_POST、$_SESSION和$_COOKIE等變量都被統一封裝到請求對象的方法里面,取而代之的是使用請求對象的get()、post()、session()和 cookie()方法來獲取當前請求的系統變量。
為什么要用請求對象的方法來替代原生的系統變量呢?首先直接操作系統變量存在很多的不便和不足,例如大寫變量、不支持過濾和批量讀取、排除等等細節,其次,也不利于單元測試。
在控制器操作方法中獲取請求變量的方法如下:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 獲取當前的GET變量
dump(Request::instance()->get());
// 或者使用助手函數
dump(request()->get());
}
}
~~~
`request`函數是系統提供的一個簡化讀取的助手函數,用于獲取當前請求對象的單例。在`ThinkPHP5`中,你不需要根據當前請求類型來判斷使用`get()`還是`post()`方法(事實上這是一個很愚蠢的做法),框架提供了一個專門的`param()`方法來統一獲取當前請求的變量,會自動識別當前的請求類型(支持`PUT`/`DELETE`等所有的請求類型)獲取不同的請求變量,例如:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 獲取當前的請求變量
dump(Request::instance()->param());
// 或者使用助手函數
dump(request()->param());
}
}
~~~
獲取單個變量的方式
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 獲取當前的請求變量
dump(Request::instance()->param('name'));
// 或者使用助手函數
dump(request()->param('name'));
}
}
~~~
官方的建議是最好棄用get()、post() 這些方法,直接使用param()方法。
param方法的優勢包括:支持統一過濾以及更方便的調用多級變量,下面舉個例子說明。
> 框架默認并沒有設置任何的過濾機制,請根據應用的需要設置全局的過濾規則。
首先設置全局過濾規則如下:
~~~
// 默認全局過濾方法
'default_filter' => 'htmlspecialchars',
~~~
控制器的hello方法改為:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 獲取當前的請求變量
dump(Request::instance()->param('data.name', '', 'strtoupper'));
// 或者使用助手函數
dump(request()->param('data.name', '', 'strtoupper'));
}
}
~~~
如果要判斷某個請求變量是否存在,可以使用:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 判斷變量是否存在(當前請求變量中)
dump(request()->has('name'));
// 判斷是否存在get變量
dump(request()->has('name', 'get'));
// 或者使用助手函數
dump(input('?name'));
dump(input('?get.name'));
}
}
~~~
系統還提供了獲取多個變量的篩選方法(不是獲取所有變量):
~~~
<?php
namespace app\index\controller;
class Index
{
public function hello()
{
// 獲取請求變量中的id和name變量
dump(request()->only('id,name'));
// 獲取請求變量中的id以外的變量
dump(request()->except('id'));
}
}
~~~
`only`表示只獲取部分變量,`except`表示獲取除了排除變量之外的所有變量
在模板文件中輸出請求變量,可以無需進行模板變量賦值而是直接輸出即可,方式如下:
~~~
{// 輸出name請求變量 }
{$Request.param.name}
~~~
