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

在做一个 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 协议》,转载必须注明作者和本文链接
? 我的导航网站已经可以公开使用啦:Cootab
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!