首页 > 解决方案 > 如何使用 FOSRestBundle 在 Symfony 4 控制器的所有方法中设置自定义标头?

问题描述

我正在使用 FOSRest Bundle 构建一个 RESTFUL API,并使用如下自定义标头返回数据:

class InvestorController extends AbstractFOSRestController
{

    /**
     * Retrieve a list of investors
     *
     * @Rest\Get("/{page}", defaults={"page"=1}, requirements={"page"="\d+"})
     *
     * @param Integer $page
     * @param Request $request
     * @param InvestorRepository $investorRepository
     *
     * @return Response
     */
    public function getInvestorsAction($page, Request $request, InvestorRepository $investorRepository)
    {
        $data = $investorRepository->getInvestorsList($page);
        $data = $this->getUser()->getId();

        $view = $this->view($data, 200)
                     ->setHeader('Access-Control-Allow-Origin', 'http://localhost:3000') // Remove this bit in PROD
                     ->setHeader('Access-Control-Allow-Credentials', 'true'); // Remove this bit in PROD


        return $this->handleView($view);
    }
}

现在我想为这个控制器中的所有响应传递这些标头。我想避免每次都手动发送它们。有没有办法自动为所有控制器的响应设置自定义标头,例如在构造函数或其他地方?

谢谢

标签: phpsymfonyhttpsymfony4

解决方案


有多种方法可以做到这一点:

  1. 我想到的第一个是配置您的网络服务器以将这些标头附加到它基于 URL 发送的每个响应中。

  2. 第二个是利用 Symfony 内部事件系统并kernel.response在那里捕获并附加标题。您需要根据来自哪里过滤响应 - https://symfony.com/doc/current/reference/events.html#kernel-response

  3. 另一件事是创建您自己的自定义处理程序,它调用这些setHeader()方法而不是在 Controller 中执行它。要提供此处理程序,您可以简单地覆盖handleView()方法 - https://symfony.com/doc/master/bundles/FOSRestBundle/2-the-view-layer.html#custom-handler


推荐阅读