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

?? ??? ??
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運行應用 第一次問候 使用Forms 數(shù)據(jù)庫應用 使用 Gii 生成代碼 進階 應用結構 概述 入口腳本 應用(Applications) 應用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴展(Extensions) 請求處理 運行概述 啟動引導(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務定位器(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) 輸入驗證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復合表單(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) 安全 認證(Authentication) 授權(Authorization) 處理密碼(Working with Passwords) 客戶端認證(Auth Clients) 最佳安全實踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(Response Formatting) 授權認證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應用模板 創(chuàng)建自定義應用程序結構 控制臺命令 核心驗證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
??

響應

響應

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

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

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

狀態(tài)碼

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

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

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

throw new \yii\web\NotFoundHttpException;

當錯誤處理器?捕獲到一個異常,會從異常中提取狀態(tài)碼并賦值到響應, 對于上述的 yii\web\NotFoundHttpException 對應HTTP 404狀態(tài)碼,以下為Yii預定義的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)建一個yii\web\HttpException異常,帶上狀態(tài)碼拋出,如下:

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

HTTP 頭部

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

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

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

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

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

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

響應主體

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

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

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

如果在發(fā)送給終端用戶之前需要格式化,應設置 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支持以下可直接使用的格式,每個實現(xiàn)了yii\web\ResponseFormatterInterface 類, 可自定義這些格式器或通過配置yii\web\Response::formatters 屬性來增加格式器。

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

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

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

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

因為響應格式默認為yii\web\Response::FORMAT_HTML, 只需要在操作方法中返回一個字符串, 如果想使用其他響應格式,應在返回數(shù)據(jù)前先設置格式,例如:

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

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

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

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

瀏覽器跳轉

瀏覽器跳轉依賴于發(fā)送一個Location?HTTP 頭,因為該功能通常被使用,Yii提供對它提供了特別的支持。

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

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

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

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

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

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

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

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

發(fā)送文件

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

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

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

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

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

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

一些瀏覽器提供特殊的名為X-Sendfile的文件發(fā)送功能,原理為將請求跳轉到服務器上的文件, Web應用可在服務器發(fā)送文件前結束,為使用該功能,可調(diào)用yii\web\Response::xSendFile(), 如下簡要列出一些常用Web服務器如何啟用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ā)送響應

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

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

  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ā)送響應主體內(nèi)容
  6. 觸發(fā) yii\web\Response::EVENT_AFTER_SEND 事件.

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

如你所見yii\web\Response::send() 觸發(fā)了幾個實用的事件,通過響應這些事件可調(diào)整或包裝響應。
?? ??: ?? ??: