亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄 搜索
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請求處理 運(yùn)行概述 啟動引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗(yàn)收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺命令 核心驗(yàn)證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
文字

響應(yīng)

響應(yīng)

當(dāng)應(yīng)用完成處理一個(gè)請求后, 會生成一個(gè)yii\web\Response響應(yīng)對象并發(fā)送給終端用戶 響應(yīng)對象包含的信息有HTTP狀態(tài)碼,HTTP頭和主體內(nèi)容等, 網(wǎng)頁應(yīng)用開發(fā)的最終目的本質(zhì)上就是根據(jù)不同的請求構(gòu)建這些響應(yīng)對象。

在大多是情況下主要處理繼承自 yii\web\Response 的?response?應(yīng)用組件, 盡管如此,Yii也允許你創(chuàng)建你自己的響應(yīng)對象并發(fā)送給終端用戶,這方面后續(xù)會闡述。

在本節(jié),將會描述如何構(gòu)建響應(yīng)和發(fā)送給終端用戶。

狀態(tài)碼

構(gòu)建響應(yīng)時(shí),最先應(yīng)做的是標(biāo)識請求是否成功處理的狀態(tài),可通過設(shè)置 yii\web\Response::statusCode 屬性,該屬性使用一個(gè)有效的HTTP 狀態(tài)碼。例如,為標(biāo)識處理已被處理成功, 可設(shè)置狀態(tài)碼為200,如下所示:

Yii::$app->response->statusCode = 200;

盡管如此,大多數(shù)情況下不需要明確設(shè)置狀態(tài)碼,因?yàn)?yii\web\Response::statusCode 狀態(tài)碼默認(rèn)為200, 如果需要指定請求失敗,可拋出對應(yīng)的HTTP異常,如下所示:

throw new \yii\web\NotFoundHttpException;

當(dāng)錯誤處理器?捕獲到一個(gè)異常,會從異常中提取狀態(tài)碼并賦值到響應(yīng), 對于上述的 yii\web\NotFoundHttpException 對應(yīng)HTTP 404狀態(tài)碼,以下為Yii預(yù)定義的HTTP異常:

  • yii\web\BadRequestHttpException: status code 400.
  • yii\web\ConflictHttpException: status code 409.
  • yii\web\ForbiddenHttpException: status code 403.
  • yii\web\GoneHttpException: status code 410.
  • yii\web\MethodNotAllowedHttpException: status code 405.
  • yii\web\NotAcceptableHttpException: status code 406.
  • yii\web\NotFoundHttpException: status code 404.
  • yii\web\ServerErrorHttpException: status code 500.
  • yii\web\TooManyRequestsHttpException: status code 429.
  • yii\web\UnauthorizedHttpException: status code 401.
  • yii\web\UnsupportedMediaTypeHttpException: status code 415.

如果想拋出的異常不在如上列表中,可創(chuàng)建一個(gè)yii\web\HttpException異常,帶上狀態(tài)碼拋出,如下:

throw new \yii\web\HttpException(402);

HTTP 頭部

可在?response?組件中操控yii\web\Response::headers來發(fā)送HTTP頭部信息,例如:

$headers = Yii::$app->response->headers;

// 增加一個(gè) Pragma 頭,已存在的Pragma 頭不會被覆蓋。$headers->add('Pragma', 'no-cache');

// 設(shè)置一個(gè)Pragma 頭. 任何已存在的Pragma 頭都會被丟棄$headers->set('Pragma', 'no-cache');

// 刪除Pragma 頭并返回刪除的Pragma 頭的值到數(shù)組$values = $headers->remove('Pragma');

補(bǔ)充: 頭名稱是大小寫敏感的,在yii\web\Response::send()方法調(diào)用前新注冊的頭信息并不會發(fā)送給用戶。

響應(yīng)主體

大多是響應(yīng)應(yīng)有一個(gè)主體存放你想要顯示給終端用戶的內(nèi)容。

如果已有格式化好的主體字符串,可賦值到響應(yīng)的yii\web\Response::content屬性,例如:

Yii::$app->response->content = 'hello world!';

如果在發(fā)送給終端用戶之前需要格式化,應(yīng)設(shè)置 yii\web\Response::format 和 yii\web\Response::data 屬性,yii\web\Response::format 屬性指定yii\web\Response::data中數(shù)據(jù)格式化后的樣式,例如:

$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON;
$response->data = ['message' => 'hello world'];

Yii支持以下可直接使用的格式,每個(gè)實(shí)現(xiàn)了yii\web\ResponseFormatterInterface 類, 可自定義這些格式器或通過配置yii\web\Response::formatters 屬性來增加格式器。

  • yii\web\Response::FORMAT_HTML: 通過 yii\web\HtmlResponseFormatter 來實(shí)現(xiàn).
  • yii\web\Response::FORMAT_XML: 通過 yii\web\XmlResponseFormatter來實(shí)現(xiàn).
  • yii\web\Response::FORMAT_JSON: 通過 yii\web\JsonResponseFormatter來實(shí)現(xiàn).
  • yii\web\Response::FORMAT_JSONP: 通過 yii\web\JsonResponseFormatter來實(shí)現(xiàn).

上述響應(yīng)主體可明確地被設(shè)置,但是在大多數(shù)情況下是通過?操作?方法的返回值隱式地設(shè)置,常用場景如下所示:

public function actionIndex(){
    return $this->render('index');
}

上述的?index?操作返回?index?視圖渲染結(jié)果,返回值會被?response?組件格式化后發(fā)送給終端用戶。

因?yàn)轫憫?yīng)格式默認(rèn)為yii\web\Response::FORMAT_HTML, 只需要在操作方法中返回一個(gè)字符串, 如果想使用其他響應(yīng)格式,應(yīng)在返回?cái)?shù)據(jù)前先設(shè)置格式,例如:

public function actionInfo(){
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return [
        'message' => 'hello world',
        'code' => 100,
    ];
}

如上所述,觸雷使用默認(rèn)的?response?應(yīng)用組件,也可創(chuàng)建自己的響應(yīng)對象并發(fā)送給終端用戶,可在操作方法中返回該響應(yīng)對象,如下所示:

public function actionInfo(){
    return \Yii::createObject([
        'class' => 'yii\web\Response',
        'format' => \yii\web\Response::FORMAT_JSON,
        'data' => [
            'message' => 'hello world',
            'code' => 100,
        ],
    ]);
}

注意: 如果創(chuàng)建你自己的響應(yīng)對象,將不能在應(yīng)用配置中設(shè)置?response?組件,盡管如此, 可使用?依賴注入?應(yīng)用通用配置到你新的響應(yīng)對象。

瀏覽器跳轉(zhuǎn)

瀏覽器跳轉(zhuǎn)依賴于發(fā)送一個(gè)Location?HTTP 頭,因?yàn)樵摴δ芡ǔ1皇褂?,Yii提供對它提供了特別的支持。

可調(diào)用yii\web\Response::redirect() 方法將用戶瀏覽器跳轉(zhuǎn)到一個(gè)URL地址,該方法設(shè)置合適的 帶指定URL的?Location?頭并返回它自己為響應(yīng)對象,在操作的方法中,可調(diào)用縮寫版yii\web\Controller::redirect(),例如:

public function actionOld(){
    return $this->redirect('http://example.com/new', 301);
}

在如上代碼中,操作的方法返回redirect()?方法的結(jié)果,如前所述,操作的方法返回的響應(yīng)對象會被當(dāng)總響應(yīng)發(fā)送給終端用戶。

除了操作方法外,可直接調(diào)用yii\web\Response::redirect() 再調(diào)用 yii\web\Response::send() 方法來確保沒有其他內(nèi)容追加到響應(yīng)中。

\Yii::$app->response->redirect('http://example.com/new', 301)->send();

補(bǔ)充: yii\web\Response::redirect() 方法默認(rèn)會設(shè)置響應(yīng)狀態(tài)碼為302,該狀態(tài)碼會告訴瀏覽器請求的資源?臨時(shí)?放在另一個(gè)URI地址上,可傳遞一個(gè)301狀態(tài)碼告知瀏覽器請求的資源已經(jīng)?永久?重定向到新的URId地址。

如果當(dāng)前請求為AJAX 請求,發(fā)送一個(gè)?Location?頭不會自動使瀏覽器跳轉(zhuǎn),為解決這個(gè)問題, yii\web\Response::redirect() 方法設(shè)置一個(gè)值為要跳轉(zhuǎn)的URL的X-Redirect?頭, 在客戶端可編寫JavaScript 代碼讀取該頭部值然后讓瀏覽器跳轉(zhuǎn)對應(yīng)的URL。

補(bǔ)充: Yii 配備了一個(gè)yii.js?JavaScript 文件提供常用JavaScript功能,包括基于X-Redirect頭的瀏覽器跳轉(zhuǎn), 因此,如果你使用該JavaScript 文件(通過yii\web\YiiAsset 資源包注冊),就不需要編寫AJAX跳轉(zhuǎn)的代碼。

發(fā)送文件

和瀏覽器跳轉(zhuǎn)類似,文件發(fā)送是另一個(gè)依賴指定HTTP頭的功能,Yii提供方法集合來支持各種文件發(fā)送需求,它們對HTTP頭都有內(nèi)置的支持。

  • yii\web\Response::sendFile(): 發(fā)送一個(gè)已存在的文件到客戶端
  • yii\web\Response::sendContentAsFile(): 發(fā)送一個(gè)文本字符串作為文件到客戶端
  • yii\web\Response::sendStreamAsFile(): 發(fā)送一個(gè)已存在的文件流作為文件到客戶端

這些方法都將響應(yīng)對象作為返回值,如果要發(fā)送的文件非常大,應(yīng)考慮使用 yii\web\Response::sendStreamAsFile() 因?yàn)樗?jié)約內(nèi)存,以下示例顯示在控制器操作中如何發(fā)送文件:

public function actionDownload(){
    return \Yii::$app->response->sendFile('path/to/file.txt');
}

如果不是在操作方法中調(diào)用文件發(fā)送方法,在后面還應(yīng)調(diào)用 yii\web\Response::send() 沒有其他內(nèi)容追加到響應(yīng)中。

\Yii::$app->response->sendFile('path/to/file.txt')->send();

一些瀏覽器提供特殊的名為X-Sendfile的文件發(fā)送功能,原理為將請求跳轉(zhuǎn)到服務(wù)器上的文件, Web應(yīng)用可在服務(wù)器發(fā)送文件前結(jié)束,為使用該功能,可調(diào)用yii\web\Response::xSendFile(), 如下簡要列出一些常用Web服務(wù)器如何啟用X-Sendfile?功能:

  • Apache:?X-Sendfile
  • Lighttpd v1.4:?X-LIGHTTPD-send-file
  • Lighttpd v1.5:?X-Sendfile
  • Nginx:?X-Accel-Redirect
  • Cherokee:?X-Sendfile and X-Accel-Redirect

發(fā)送響應(yīng)

在yii\web\Response::send() 方法調(diào)用前響應(yīng)中的內(nèi)容不會發(fā)送給用戶,該方法默認(rèn)在yii\base\Application::run() 結(jié)尾自動調(diào)用,盡管如此,可以明確調(diào)用該方法強(qiáng)制立即發(fā)送響應(yīng)。

yii\web\Response::send() 方法使用以下步驟來發(fā)送響應(yīng):

  1. 觸發(fā) yii\web\Response::EVENT_BEFORE_SEND 事件.
  2. 調(diào)用 yii\web\Response::prepare() 來格式化 yii\web\Response::data 為 yii\web\Response::content.
  3. 觸發(fā) yii\web\Response::EVENT_AFTER_PREPARE 事件.
  4. 調(diào)用 yii\web\Response::sendHeaders() 來發(fā)送注冊的HTTP頭
  5. 調(diào)用 yii\web\Response::sendContent() 來發(fā)送響應(yīng)主體內(nèi)容
  6. 觸發(fā) yii\web\Response::EVENT_AFTER_SEND 事件.

一旦yii\web\Response::send() 方法被執(zhí)行后,其他地方調(diào)用該方法會被忽略, 這意味著一旦響應(yīng)發(fā)出后,就不能再追加其他內(nèi)容。

如你所見yii\web\Response::send() 觸發(fā)了幾個(gè)實(shí)用的事件,通過響應(yīng)這些事件可調(diào)整或包裝響應(yīng)。
上一篇: 下一篇: