IncomingRequest 類提供了一個(gè)客戶端(比如 瀏覽器)HTTP 請(qǐng)求的面向?qū)ο蠓庋b。 基于它可以訪問所有 Request 和 Message 中的方法, 以及以下列出的方法。
如果當(dāng)前控制器繼承了 CodeIgniter\Controller
,則一個(gè) Request 類的實(shí)例已被初始化并可作為屬性被使用:
class UserController extends CodeIgniter\Controller
{
public function index()
{
if ($this->request->isAJAX())
{
. . .
}
}
}
如果在控制器外使用 Request 對(duì)象,可以通過 Services class 獲得實(shí)例:
$request = \Config\Services::request();
推薦將 Request 對(duì)象作為一個(gè)依賴注入到當(dāng)前類中并保存為一個(gè)屬性:
use CodeIgniter\HTTP\RequestInterface;
class SomeClass
{
protected $request;
public function __construct(RequestInterface $request)
{
$this->request = $request;
}
}
$someClass = new SomeClass(\Config\Services::request());
請(qǐng)求有多種來(lái)源,包含使用 AJAX 發(fā)起和使用 CLI 發(fā)起的??赏ㄟ^ isAJAX()
and isCLI()
來(lái)檢測(cè):
// Check for AJAX request.
if ($request->isAJAX())
{
. . .
}
// Check for CLI Request
if ($request->isCLI())
{
. . .
}
你可以檢測(cè)請(qǐng)求的 HTTP 類型:
// Returns 'post'
$method = $request->getMethod();
該方法默認(rèn)返回類型是小寫的字符串 (比如 ‘get’, ‘post’ 等等),你可以通過傳遞 true
參數(shù)來(lái)獲得大寫的返回結(jié)果:
// Returns 'GET'
$method = $request->getMethod(true);
還可以通過 isSecure()
方法檢測(cè)請(qǐng)求是否是 HTTPS:
if (! $request->isSecure())
{
force_https();
}
你可以通過 Request 對(duì)象讀取 $_SERVER, $_GET, $_POST, $_ENV, $_SESSION 內(nèi)的信息。 因?yàn)檩斎霐?shù)據(jù)不會(huì)自動(dòng)過濾,只會(huì)返回請(qǐng)求時(shí)的原始數(shù)據(jù)。而使用這些方法去替代直接獲取數(shù)據(jù)的(比如 $_POST[‘something’])主要優(yōu)點(diǎn)是當(dāng)參數(shù)不存在時(shí)會(huì)返回 null ,而且你還能做數(shù)據(jù)過濾。這可以使你很方便的直接使用 數(shù)據(jù)而不需要先去判斷某個(gè)參數(shù)是否存在。換句話說,一般情況下你以前會(huì)這么做:
$something = isset($_POST['foo']) ? $_POST['foo'] : NULL;
而使用 CodeIgniter 的內(nèi)建方法你可以很簡(jiǎn)單的做到同樣的事:
$something = $request->getVar('foo');
因?yàn)?getVar()
方法從 $_REQUEST 獲得數(shù)據(jù),所以使用它可以獲得 $_GET, $POST, $_COOKIE 內(nèi)的數(shù)據(jù)。雖然這很方便,但是你有時(shí)也需要使用一些特定的方法,比如:
$request->getGet()
$request->getPost()
$request->getServer()
$request->getCookie()
另外,還有一些實(shí)用的方法可以同時(shí)獲取 $_GET 或者 $_POST 的數(shù)據(jù),因?yàn)橛蝎@取順序的問題,我們提供了以下方法:
$request->getPostGet()
- 先 $_POST, 后 $_GET$request->getGetPost()
- 先 $_GET, 后 $_POST獲取 JSON 數(shù)據(jù)
你可以使用 getJSON()
去獲取 php://input 傳遞的 JSON 格式的數(shù)據(jù)。
注解
因?yàn)闊o(wú)法檢測(cè)來(lái)源數(shù)據(jù)是否具有有效的JSON格式,所以只有當(dāng)你確認(rèn)數(shù)據(jù)來(lái)源格式是JSON后才可使用。
$json = $request->getJSON();
默認(rèn)情況下,這會(huì)返回一個(gè) JSON 數(shù)據(jù)對(duì)象。如果你需要一個(gè)數(shù)據(jù),請(qǐng)傳遞 true
作為第一個(gè)參數(shù)。
該方法的第二和第三個(gè)參數(shù)則分別對(duì)應(yīng) json_decode 方法的 depth
和 options
參數(shù).
獲取原始數(shù)據(jù)(獲取 Method 為 PUT, PATCH, DELETE 傳遞的數(shù)據(jù))
最后,你可以通過 getRawInput()
去獲取 php://input 傳遞的原始數(shù)據(jù)。
$data = $request-&getRawInput();
這會(huì)返回?cái)?shù)據(jù)并轉(zhuǎn)換為數(shù)組。比如:
var_dump($request->getRawInput());
[
'Param1' => 'Value1',
'Param2' => 'Value2'
]
為了保證應(yīng)用程序的安全,必須過濾所有輸入的數(shù)據(jù)。你可以傳遞過濾類型到方法的最后一個(gè)參數(shù)里。會(huì)調(diào)用系統(tǒng)方法 filter_var()
去過濾。具體過濾類型可以參考 PHP 手冊(cè)里的列表 valid filter types.
過濾一個(gè) POST 變量可以這么做:
$email = $request->getVar('email', FILTER_SANITIZE_EMAIL);
以上提到的方法中除了 getJSON()
和 getRawInput()
,都支持給最后一個(gè)參數(shù)傳遞類型來(lái)實(shí)現(xiàn)過濾。
你可以通過 getHeaders()
方法獲得請(qǐng)求的數(shù)據(jù)頭,該方法會(huì)以數(shù)組形式返回所有的數(shù)據(jù)頭信息,數(shù)據(jù)的鍵值為數(shù)據(jù)頭名稱,值則為一個(gè) CodeIgniter\HTTP\Header
的實(shí)例:
var_dump($request->getHeaders());
[
'Host' => CodeIgniter\HTTP\Header,
'Cache-Control' => CodeIgniter\HTTP\Header,
'Accept' => CodeIgniter\HTTP\Header,
]
如果你只是想獲得某個(gè)頭的信息,你可以將數(shù)據(jù)頭名稱作為參數(shù)傳遞給 getHeader()
方法。數(shù)據(jù)頭名稱無(wú)視大小寫,如果存在則返回指定頭信息。如果不存在則返回 null
// 以下這些效果一樣
$host = $request->getHeader('host');
$host = $request->getHeader('Host');
$host = $request->getHeader('HOST');
你可以使用 hasHeader()
去判斷請(qǐng)求頭是否存在:
if ($request->hasHeader('DNT'))
{
// Don't track something...
}
如果你需要某個(gè)頭的值并在一行字符串內(nèi)輸出,可以使用 getHeaderLine()
方法:
// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: '.$request->getHeaderLine('accept-encoding');
如果你需要完整頭信息,輸出包括全部名稱和值的字符串,可以使用如下方法做轉(zhuǎn)換:
echo (string)$header;
你可以通過訪問 $request->uri
屬性獲取代表當(dāng)前訪問信息的 URI 對(duì)象。通過以下方法獲取當(dāng)前請(qǐng)求的完整訪問地址:
$uri = (string)$request->uri;
該對(duì)象賦予了你訪問全部請(qǐng)求信息的能力:
$uri = $request->uri;
echo $uri->getScheme(); // http
echo $uri->getAuthority(); // snoopy:password@example.com:88
echo $uri->getUserInfo(); // snoopy:password
echo $uri->getHost(); // example.com
echo $uri->getPort(); // 88
echo $uri->getPath(); // /path/to/page
echo $uri->getQuery(); // foo=bar&bar=baz
echo $uri->getSegments(); // ['path', 'to', 'page']
echo $uri->getSegment(1); // 'path'
echo $uri->getTotalSegments(); // 3
所有上傳文件的信息可以通過 $request->getFiles()
方法獲得,該方法會(huì)返回一個(gè) FileCollection 實(shí)例。這會(huì)有助于減少處理文件上傳的工作量,以及使用最佳方案去降低安全風(fēng)險(xiǎn)。
$files = $request->getFiles();
// Grab the file by name given in HTML form
if ($files->hasFile('uploadedFile')
{
$file = $files->getFile('uploadedfile');
// Generate a new secure name
$name = $file->getRandomName();
// Move the file to it's new home
$file->move('/path/to/dir', $name);
echo $file->getSize('mb'); // 1.23
echo $file->getExtension(); // jpg
echo $file->getType(); // image/jpg
}
你也可以通過HTML中提交的文件名去獲取單個(gè)上傳文件:
$file = $request->getFile('uploadedfile');
你可以很輕松的通過 negotiate()
方法來(lái)完成信息內(nèi)容類型的協(xié)商:
$language = $request->negotiate('language', ['en-US', 'en-GB', 'fr', 'es-mx']);
$imageType = $request->negotiate('media', ['image/png', 'image/jpg']);
$charset = $request->negotiate('charset', ['UTF-8', 'UTF-16']);
$contentType = $request->negotiate('media', ['text/html', 'text/xml']);
$encoding = $request->negotiate('encoding', ['gzip', 'compress']);
查看 Content Negotiation 獲得更多細(xì)節(jié)。
注解
除了這里列出的,本類還繼承了 Request Class 和 Message Class 的方法。
以下方法由父類提供:
CodeIgniter\HTTP\Request::getIPAddress()
CodeIgniter\HTTP\Request::validIP()
CodeIgniter\HTTP\Request::getMethod()
CodeIgniter\HTTP\Request::getServer()
CodeIgniter\HTTP\Message::body()
CodeIgniter\HTTP\Message::setBody()
CodeIgniter\HTTP\Message::populateHeaders()
CodeIgniter\HTTP\Message::headers()
CodeIgniter\HTTP\Message::header()
CodeIgniter\HTTP\Message::headerLine()
CodeIgniter\HTTP\Message::setHeader()
CodeIgniter\HTTP\Message::removeHeader()
CodeIgniter\HTTP\Message::appendHeader()
CodeIgniter\HTTP\Message::protocolVersion()
CodeIgniter\HTTP\Message::setProtocolVersion()
CodeIgniter\HTTP\Message::negotiateMedia()
CodeIgniter\HTTP\Message::negotiateCharset()
CodeIgniter\HTTP\Message::negotiateEncoding()
CodeIgniter\HTTP\Message::negotiateLanguage()
CodeIgniter\HTTP\Message::negotiateLanguage()
CodeIgniter\HTTP\IncomingRequest
isCLI
()
返回: | 由命令行發(fā)起的請(qǐng)求會(huì)返回 true ,其他返回 false。 |
---|---|
返回類型: | bool |
isAJAX
()
返回: | AJAX請(qǐng)求返回 true ,其他返回 false。 |
---|---|
返回類型: | bool |
isSecure
()
返回: | HTTPS請(qǐng)求返回 true ,其他返回 false。 |
---|---|
返回類型: | bool |
getVar
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – 需要查找的數(shù)據(jù)名。 |
---|---|
$filter (int) – 過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 REQUEST 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 REQUEST 值,不存在返回 null |
返回類型: | mixed/null |
第一個(gè)參數(shù)包含需要查找的數(shù)據(jù)名
$request->getVar('some_data');
如數(shù)據(jù)不存在則返回 null 。
只需傳遞期望的過濾類型到第二個(gè)參數(shù),就可以幫助你完成數(shù)據(jù)過濾
$request->getVar('some_data', FILTER_SANITIZE_STRING);
不傳任何參數(shù)會(huì)得到一個(gè)包含全部 REQUEST 數(shù)據(jù)的數(shù)組。
第一個(gè)參數(shù) null ,第二個(gè)參數(shù)設(shè)置過濾類型,可獲得一個(gè)被過濾的包涵全部 REQUEST 數(shù)據(jù)的數(shù)組
$request->getVar(null, FILTER_SANITIZE_STRING); // returns all POST items with string sanitation
獲取多個(gè)鍵值的信息,可以將需要的鍵值以數(shù)組形式傳遞給第一個(gè)參數(shù)
$request->getVar(['field1', 'field2']);
與之前一樣,此時(shí)傳遞過濾類型給第二個(gè)參數(shù),也可獲得過濾后的數(shù)據(jù)
$request->getVar(['field1', 'field2'], FILTER_SANITIZE_STRING);
getGet
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – 需要查找的數(shù)據(jù)名。 |
---|---|
$filter (int) –過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 GET 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 GET 值,不存在返回 null |
返回類型: | mixed/null |
該方法與 getVar()
類似, 只返回 GET 的數(shù)據(jù)。
getPost
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – 需要查找的數(shù)據(jù)名。 |
---|---|
$filter (int) –過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 POST 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 POST 值,不存在返回 null |
返回類型: | mixed/null |
該方法與 getVar()
類似, 只返回 POST 的數(shù)據(jù)。
getPostGet
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – 需要查找的數(shù)據(jù)名。 |
---|---|
$filter (int) –過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 POST/GET 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 POST/GET 值,不存在返回 null |
返回類型: | mixed|null |
該方法和 getPost()
,getGet()
類似,它會(huì)同時(shí)查找 POST 和 GET 兩個(gè)數(shù)組來(lái)獲取數(shù)據(jù), 先查找 POST ,再查找 GET:
$request->getPostGet('field1');
getGetPost
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – 需要查找的數(shù)據(jù)名。 |
---|---|
$filter (int) –過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 POST/GET 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 POST/GET 值,不存在返回 null |
返回類型: | mixed|null |
該方法和 getPost()
,getGet()
類似,它會(huì)同時(shí)查找 POST 和 GET 兩個(gè)數(shù)組來(lái)獲取數(shù)據(jù), 先查找 GET ,再查找 POST:
$request->getGetPost('field1');
getCookie
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – COOKIE 名。 |
---|---|
$filter (int) –過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 COOKIE 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 COOKIE 值,不存在返回 null |
返回類型: | mixed |
該方法與 getPost()
,getGet()
類似, 只返回 COOKIE 的數(shù)據(jù)
$request->getCookie('some_cookie');
$request->getCookie('some_cookie', FILTER_SANITIZE_STRING); // with filter
獲取多個(gè)鍵值的信息,可以將需要的鍵值以數(shù)組形式傳遞給第一個(gè)參數(shù)
$request->getCookie(array('some_cookie', 'some_cookie2'));
注解
與 Cookie Helper functionget_cookie()
不同, 該方法不會(huì)自動(dòng)添加配置中$config['cookie_prefix']
的值。
getServer
([$index = null[, $filter = null[, $flags = null]]])
參數(shù): | $index (string) – 服務(wù)器信息名。 |
---|---|
$filter (int) –過濾類型。參見列表 查看。 | |
$flags (int) –過濾器名,值為過濾器的預(yù)定義變量名。 參見列表 查看。 | |
返回: | 不傳參數(shù)會(huì)返回 SERVER 中的所有元素,傳參并且參數(shù)存在則返回對(duì)應(yīng)的 SERVER 值,不存在返回 null |
返回類型: | mixed |
該方法與 getPost()
,getGet()
,getCookie()
類似, 只返回 SERVER 的數(shù)據(jù)
$request->getServer('some_data');
獲取多個(gè)鍵值的信息,可以將需要的鍵值以數(shù)組形式傳遞給第一個(gè)參數(shù)
$request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
getUserAgent
([$filter = null])
參數(shù): | $filter (int) –過濾類型。參見列表 查看。 |
---|---|
返回: | 包含 User Agent 信息的字符串,不存在返回 null |
返回類型: | mixed |
該方法從服務(wù)器信息哪查找并以字符串形式返回 User Agent
$request->getUserAgent();
更多建議: