最近為了儘可能優雅地實現產品需求,天天看 Yii 原始碼,感覺還是非常爽的。本文將要介紹如何使用 Yii 內建的方法,輸出檔案、流、字串為下載響應。
通過檢視 yii\web\Response
原始碼可知,其提供如下方法:
public function sendFile($filePath, $attachmentName = null, $options = []);
public function sendContentAsFile($content, $attachmentName, $options = []);
public function sendStreamAsFile($handle, $attachmentName, $options = []);
那麼如何在控制器內呼叫此方法輸出呢?
兩種方案:
public function actionIndex()
{
return \Yii::$app->getResponse()->sendFile(...); // `sendFile` 返回 self
}
或
public function actionIndex()
{
\Yii::$app->getResponse()->sendFile(...);
return null; // or `return;` or do nothing.
}
根據
yii\web\Application::handleRequest
可知:Yii 會判斷 action 返回值。若是
yii\web\Response
例項則直接返回給\yii\base\Application::run
函式進行輸出。否則判斷其是否為
null
,若是,則什麼都不做;則我們設定的sendFile
就會有效。