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

direktori cari
閱讀前篇 簡(jiǎn)介 Yii 是什么 從 Yii 1.1 升級(jí) 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問(wèn)候 使用Forms 數(shù)據(jù)庫(kù)應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過(guò)濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請(qǐng)求處理 運(yùn)行概述 啟動(dòng)引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請(qǐng)求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動(dòng)加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫(kù)工作 數(shù)據(jù)庫(kù)訪問(wèn) (Data Access Objects) 查詢生成器(Query Builder) 活動(dòng)記錄(Active Record) 數(shù)據(jù)庫(kù)遷移(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) 分頁(yè)(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ù)緩存 片段緩存 頁(yè)面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測(cè)試 概述(Overview) 配置測(cè)試環(huán)境(Testing environment setup) 單元測(cè)試(Unit Tests) 功能測(cè)試(Function Tests) 驗(yàn)收測(cè)試(Acceptance Tests) 測(cè)試夾具(Fixtures) 高級(jí)專題 高級(jí)應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺(tái)命令 核心驗(yàn)證器(Core Validators) 國(guó)際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
watak

響應(yīng)

響應(yīng)

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

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

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

狀態(tài)碼

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

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

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

throw new \yii\web\NotFoundHttpException;

當(dāng)錯(cuò)誤處理器?捕獲到一個(gè)異常,會(huì)從異常中提取狀態(tài)碼并賦值到響應(yīng), 對(duì)于上述的 yii\web\NotFoundHttpException 對(duì)應(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來(lái)發(fā)送HTTP頭部信息,例如:

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

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

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

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

補(bǔ)充: 頭名稱是大小寫敏感的,在yii\web\Response::send()方法調(diào)用前新注冊(cè)的頭信息并不會(huì)發(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 類, 可自定義這些格式器或通過(guò)配置yii\web\Response::formatters 屬性來(lái)增加格式器。

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

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

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

上述的?index?操作返回?index?視圖渲染結(jié)果,返回值會(huì)被?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)對(duì)象并發(fā)送給終端用戶,可在操作方法中返回該響應(yīng)對(duì)象,如下所示:

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)對(duì)象,將不能在應(yīng)用配置中設(shè)置?response?組件,盡管如此, 可使用?依賴注入?應(yīng)用通用配置到你新的響應(yīng)對(duì)象。

瀏覽器跳轉(zhuǎn)

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

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

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

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

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

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

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

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

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

發(fā)送文件

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

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

這些方法都將響應(yīng)對(duì)象作為返回值,如果要發(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ā)送功能,原理為將請(qǐng)求跳轉(zhuǎn)到服務(wù)器上的文件, Web應(yīng)用可在服務(wù)器發(fā)送文件前結(jié)束,為使用該功能,可調(diào)用yii\web\Response::xSendFile(), 如下簡(jiǎn)要列出一些常用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)容不會(huì)發(fā)送給用戶,該方法默認(rèn)在yii\base\Application::run() 結(jié)尾自動(dòng)調(diào)用,盡管如此,可以明確調(diào)用該方法強(qiáng)制立即發(fā)送響應(yīng)。

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

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

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

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