触发器error404.json.twig

触发器error404.json.twig,json,rest,symfony,Json,Rest,Symfony,我试图让Symfony返回我的自定义json错误模板,但它一直返回HTML版本。使用rest客户端,我已将Accept和Content Type设置为“application/json”,但只返回error404.html.twig的内容,而不返回error404.json.twig文件 目前,我正在通过一个完全无效的URL(即没有路由)对此进行测试,但是,一旦我完成了这项工作,我也将使用它来处理不会导致资源和内部代码抛出HttpNotFoundException的有效URL,在请求上设置头实际

我试图让Symfony返回我的自定义json错误模板,但它一直返回HTML版本。使用rest客户端,我已将AcceptContent Type设置为“application/json”,但只返回error404.html.twig的内容,而不返回error404.json.twig文件


目前,我正在通过一个完全无效的URL(即没有路由)对此进行测试,但是,一旦我完成了这项工作,我也将使用它来处理不会导致资源和内部代码抛出HttpNotFoundException的有效URL,在请求上设置头实际上不会对返回的错误模板产生任何影响,尽管看起来这可能是逻辑路径。生成的错误模板基于请求格式,该格式可以在
\u format
参数中设置,也可以在
请求
对象本身上手动设置。中有一个解决方案,但如果遇到404错误,则无法从不存在路由的控制器准确设置
\u format
参数或
$request->setRequestFormat('json')
调用

Symfony有相当好的文档,包括您可能希望采用的路径,即。基本上,您将重写or方法,该方法将采用
Accept
头并检查
application/json
。您还可以检查
内容类型
标题作为附加要求。下面是你的听众的声明:

# app/config/services.yml
services:
    app.exception_controller:
    class: AppBundle\Controller\CustomExceptionController
    arguments: ['@twig', '%kernel.debug%']
然后设置细枝参数:

# app/config/config.yml
twig:
    exception_controller:  app.exception_controller:showAction
现在定义类并覆盖所需的相关部分。第一个示例通过检查
Accept
标题,然后修改
请求
格式来覆盖
showAction()

namespace AppBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;

class CustomExceptionController extends ExceptionController
{
    /*
     * {@inheritDoc}
     */
    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
    {
        if (in_array('application/json', $request->getAcceptableContentTypes())) {
            $request->setRequestFormat('json');
        }

        parent::showAction($request, $exception, $logger);
    }
}
Symfony说
findTemplate()
方法是定位要使用的模板的方法,因此您可以将代码放在那里。下面是一个覆盖该函数的示例,如果您需要同时满足这两个条件,还需要额外检查
内容类型
标题:

namespace AppBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;

class CustomExceptionController extends ExceptionController
{
    /*
     * {@inheritDoc}
     */
    protected function findTemplate(Request $request, $format, $code, $showException)
    {
        if (in_array('application/json', $request->getAcceptableContentTypes()) &&
            0 === strpos($request->headers->get('Content-Type'), 'application/json')
        ) {
            $format = 'json';
        }

        parent::findTemplate($request, $format, $code, $showException);
    }
}
当然,您也可以自己创建一个异常侦听器,以便进行进一步的控制


如果您使用,它将尝试通过侦听器使用
请求
接受
标题和格式优先级配置来执行。如果您使用此捆绑包,您可能可以避免自定义编码,而只需依赖它。

这真令人失望。因为他们已经为error404.json.twig让路,所以当请求是json或html时,他们应该选择它。希望我能有时间在补丁中解决这个问题。我怀疑这会有所改变-我认为他们不想假设它是基于报头的什么类型的请求,而是希望您在路由中定义它,或者让您手动添加侦听器。不管怎样,希望这个解决方案对您有效…至少它没有太多额外的代码。