不是所有 Response 類都有 header () 方法

chuoke發表於2020-04-28

在做一個 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 協議》,轉載必須註明作者和本文連結

初出茅廬,一知半解,望有識之士多多指教。抱拳...

相關文章