在做一個 Excel 匯出,用的 maatwebsite/excel 擴充套件包,直接下載的方式,之前也用過,像往常一樣一切準備就緒後,測試下效果,居然報個 header 方法不存在:
Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()
當時我就有點懵,我都用這麼多次了,頭一次遇到這個提示,哪兒來的,然後發現是個定義的中介軟體:
$response->header('Access-Control-Allow-Origin', '*');
心想怎麼會呢,不過我還是選擇多看一眼,
首先看到的是 ResponseFactory
中有:
Illuminate\Http\Response
Illuminate\HttpJsonResponse
Symfony\Component\HttpFoundation\StreamedResponse
Symfony\Component\HttpFoundation\BinaryFileResponse
他們共有的基類是 Symfony\Component\HttpFoundation\Response
,但是隻有前面兩個 use Illuminate\Http\ResponseTrait
,而 header
方法在這個 trait 裡:
/**
* Set a header on the Response.
*
* @param string $key
* @param array|string $values
* @param bool $replace
* @return $this
*/
public function header($key, $values, $replace = true)
{
$this->headers->set($key, $values, $replace);
return $this;
}
於是我毅然決然的把中介軟體裡的方式改成 $response->headers->set('Access-Control-Allow-Origin', '*');
,之後就正常的返回。
結論
不是所有 Response
類都有 header()
方法,如果在外層對 response 新增 header 項一定要儘可能滿足所有情況(當然這個是自己維護的專案,想怎麼改就怎麼改)。
本作品採用《CC 協議》,轉載必須註明作者和本文連結