鍍金池/ 教程/ PHP/ 請(qǐng)求
查詢構(gòu)建器
HTTP 緩存
單元測(cè)試
資源
數(shù)據(jù)庫(kù)遷移
Fixtures
收集列表輸入
認(rèn)證
助手類
緩存
數(shù)據(jù)緩存
最佳安全實(shí)踐
響應(yīng)格式
使用 Gii 生成代碼
服務(wù)定位器
性能優(yōu)化
資源
多模型的復(fù)合表單
控制器
Html 幫助類
運(yùn)行機(jī)制概述
快速入門
屬性(Property)
使用表單
配置測(cè)試環(huán)境
數(shù)據(jù)提供者
使用數(shù)據(jù)庫(kù)
授權(quán)
輸入驗(yàn)證
類自動(dòng)加載(Autoloading)
版本
響應(yīng)
Sessions 和 Cookies
數(shù)組助手類
創(chuàng)建你自己的應(yīng)用程序結(jié)構(gòu)
文件上傳
路由
收發(fā)郵件
模型
小部件
更上一層樓
頁(yè)面緩存
請(qǐng)求
片段緩存
排序
處理密碼
數(shù)據(jù)小部件
模塊
事件
控制器
從 Yii 1.1 升級(jí)
應(yīng)用組件
驗(yàn)收測(cè)試
入口腳本
總覽
Url 幫助類
行為
速率限制
控制臺(tái)命令
依賴注入容器
視圖
功能測(cè)試
錯(cuò)誤處理
過(guò)濾器
主題
應(yīng)用主體
引入第三方代碼
共享托管環(huán)境
測(cè)試
擴(kuò)展
路由
使用模板引擎
核心驗(yàn)證器(Core Validators)
分頁(yè)
數(shù)據(jù)庫(kù)訪問(wèn) (DAO)
配置
創(chuàng)建表單
日志
安裝 Yii
客戶端腳本使用
組件(Component)
說(shuō)聲 Hello
運(yùn)行應(yīng)用
數(shù)據(jù)格式器
認(rèn)證
錯(cuò)誤處理
別名(Aliases)
Active Record
啟動(dòng)引導(dǎo)(Bootstrapping)
國(guó)際化

請(qǐng)求

一個(gè)應(yīng)用的請(qǐng)求是用 [[yii\web\Request]] 對(duì)象來(lái)表示的,該對(duì)象提供了諸如請(qǐng)求參數(shù)(譯者注:通常是 GET 參數(shù)或者 POST 參數(shù))、HTTP 頭、cookies 等信息。默認(rèn)情況下,對(duì)于一個(gè)給定的請(qǐng)求,你可以通過(guò) request application component 應(yīng)用組件([[yii\web\Request]] 類的實(shí)例)獲得訪問(wèn)相應(yīng)的請(qǐng)求對(duì)象。在本章節(jié),我們將介紹怎樣在你的應(yīng)用中使用這個(gè)組件。

請(qǐng)求參數(shù)

要獲取請(qǐng)求參數(shù),你可以調(diào)用 request 組件的 [[yii\web\Request::get()|get()]] 方法和 [[yii\web\Request::post()|post()]] 方法。他們分別返回 $_GET$_POST 的值。例如,

$request = Yii::$app->request;

$get = $request->get(); 
// 等價(jià)于: $get = $_GET;

$id = $request->get('id');   
// 等價(jià)于: $id = isset($_GET['id']) ? $_GET['id'] : null;

$id = $request->get('id', 1);   
// 等價(jià)于: $id = isset($_GET['id']) ? $_GET['id'] : 1;

$post = $request->post(); 
// 等價(jià)于: $post = $_POST;

$name = $request->post('name');   
// 等價(jià)于: $name = isset($_POST['name']) ? $_POST['name'] : null;

$name = $request->post('name', '');   
// 等價(jià)于: $name = isset($_POST['name']) ? $_POST['name'] : '';

信息:建議你像上面那樣通過(guò) request 組件來(lái)獲取請(qǐng)求參數(shù),而不是直接訪問(wèn) $_GET$_POST。這使你更容易編寫(xiě)測(cè)試用例,因?yàn)槟憧梢詡卧鞌?shù)據(jù)來(lái)創(chuàng)建一個(gè)模擬請(qǐng)求組件。

當(dāng)實(shí)現(xiàn) RESTful APIs 接口的時(shí)候,你經(jīng)常需要獲取通過(guò) PUT, PATCH 或者其他的 request methods 請(qǐng)求方法提交上來(lái)的參數(shù)。你可以通過(guò)調(diào)用 [[yii\web\Request::getBodyParam()]] 方法來(lái)獲取這些參數(shù)。例如,

$request = Yii::$app->request;

// 返回所有參數(shù)
$params = $request->bodyParams;

// 返回參數(shù) "id"
$param = $request->getBodyParam('id');

信息:不同于 GET 參數(shù),POST,PUTPATCH 等等這些提交上來(lái)的參數(shù)是在請(qǐng)求體中被發(fā)送的。當(dāng)你通過(guò)上面介紹的方法訪問(wèn)這些參數(shù)的時(shí)候,request 組件會(huì)解析這些參數(shù)。你可以通過(guò)配置 [[yii\web\Request::parsers]] 屬性來(lái)自定義怎樣解析這些參數(shù)。

請(qǐng)求方法

你可以通過(guò) Yii::$app->request->method 表達(dá)式來(lái)獲取當(dāng)前請(qǐng)求使用的 HTTP 方法。這里還提供了一整套布爾屬性用于檢測(cè)當(dāng)前請(qǐng)求是某種類型。例如,

$request = Yii::$app->request;

if ($request->isAjax) { /* 該請(qǐng)求是一個(gè) AJAX 請(qǐng)求 */ }
if ($request->isGet)  { /* 請(qǐng)求方法是 GET */ }
if ($request->isPost) { /* 請(qǐng)求方法是 POST */ }
if ($request->isPut)  { /* 請(qǐng)求方法是 PUT */ }

請(qǐng)求 URLs

request 組件提供了許多方式來(lái)檢測(cè)當(dāng)前請(qǐng)求的 URL。

假設(shè)被請(qǐng)求的 URL 是 http://example.com/admin/index.php/product?id=100,你可以像下面描述的那樣獲取 URL 的各個(gè)部分:

  • [[yii\web\Request::url|url]]:返回 /admin/index.php/product?id=100, 此 URL 不包括 host info 部分。
  • [[yii\web\Request::absoluteUrl|absoluteUrl]]:返回 http://example.com/admin/index.php/product?id=100,包含 host infode 的整個(gè) URL。
  • [[yii\web\Request::hostInfo|hostInfo]]:返回 http://example.com, 只有 host info 部分。
  • [[yii\web\Request::pathInfo|pathInfo]]:返回 /product, 這個(gè)是入口腳本之后,問(wèn)號(hào)之前(查詢字符串)的部分。
  • [[yii\web\Request::queryString|queryString]]:返回 id=100,問(wèn)號(hào)之后的部分。
  • [[yii\web\Request::baseUrl|baseUrl]]:返回 /admin, host info 之后,入口腳本之前的部分。
  • [[yii\web\Request::scriptUrl|scriptUrl]]:返回 /admin/index.php, 沒(méi)有 path info 和查詢字符串部分。
  • [[yii\web\Request::serverName|serverName]]:返回 example.com, URL 中的 host name。
  • [[yii\web\Request::serverPort|serverPort]]:返回 80, 這是 web 服務(wù)中使用的端口。

HTTP 頭

你可以通過(guò) [[yii\web\Request::headers]] 屬性返回的 [[yii\web\HeaderCollection|header collection]] 獲取 HTTP 頭信息。例如,

// $headers 是一個(gè) yii\web\HeaderCollection 對(duì)象
$headers = Yii::$app->request->headers;

// 返回 Accept header 值
$accept = $headers->get('Accept');

if ($headers->has('User-Agent')) { /* 這是一個(gè) User-Agent 頭 */ }

請(qǐng)求組件也提供了支持快速訪問(wèn)常用頭的方法,包括:

  • [[yii\web\Request::userAgent|userAgent]]:返回 User-Agent 頭。
  • [[yii\web\Request::contentType|contentType]]:返回 Content-Type 頭的值, Content-Type 是請(qǐng)求體中 MIME 類型數(shù)據(jù)。
  • [[yii\web\Request::acceptableContentTypes|acceptableContentTypes]]:返回用戶可接受的內(nèi)容 MIME 類型。返回的類型是按照他們的質(zhì)量得分來(lái)排序的。得分最高的類型將被最先返回。
  • [[yii\web\Request::acceptableLanguages|acceptableLanguages]]:返回用戶可接受的語(yǔ)言。返回的語(yǔ)言是按照他們的偏好層次來(lái)排序的。第一個(gè)參數(shù)代表最優(yōu)先的語(yǔ)言。

假如你的應(yīng)用支持多語(yǔ)言,并且你想在終端用戶最喜歡的語(yǔ)言中顯示頁(yè)面,那么你可以使用語(yǔ)言協(xié)商方法 [[yii\web\Request::getPreferredLanguage()]]。這個(gè)方法通過(guò) [[yii\web\Request::acceptableLanguages|acceptableLanguages]] 在你的應(yīng)用中所支持的語(yǔ)言列表里進(jìn)行比較篩選,返回最適合的語(yǔ)言。

提示:你也可以使用 [[yii\filters\ContentNegotiator|ContentNegotiator]] 過(guò)濾器進(jìn)行動(dòng)態(tài)確定哪些內(nèi)容類型和語(yǔ)言應(yīng)該在響應(yīng)中使用。這個(gè)過(guò)濾器實(shí)現(xiàn)了上面介紹的內(nèi)容協(xié)商的屬性和方法。

客戶端信息

你可以通過(guò) [[yii\web\Request::userHost|userHost]] 和 [[yii\web\Request::userIP|userIP]] 分別獲取 host name 和客戶機(jī)的 IP 地址,例如,

$userHost = Yii::$app->request->userHost;
$userIP = Yii::$app->request->userIP;
上一篇:Html 幫助類下一篇:安裝 Yii