CodeIgniter4 IncomingRequest類

2020-08-17 15:22 更新

IncomingRequest 類提供了一個(gè)客戶端(比如 瀏覽器)HTTP 請(qǐng)求的面向?qū)ο蠓庋b。 基于它可以訪問所有 Request 和 Message 中的方法, 以及以下列出的方法。

獲得請(qǐng)求

如果當(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)求類型

請(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();
}

數(shù)據(jù)讀取

你可以通過 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 方法的 depthoptions 參數(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'
]

數(shù)據(jù)過濾

為了保證應(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)過濾。

獲取數(shù)據(jù)頭

你可以通過 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;

請(qǐng)求地址

你可以通過訪問 $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');

內(nèi)容協(xié)商

你可以很輕松的通過 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 function get_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();
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)