触发器error404.json.twig
我试图让Symfony返回我的自定义json错误模板,但它一直返回HTML版本。使用rest客户端,我已将Accept和Content Type设置为“application/json”,但只返回error404.html.twig的内容,而不返回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,在请求上设置头实际
目前,我正在通过一个完全无效的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时,他们应该选择它。希望我能有时间在补丁中解决这个问题。我怀疑这会有所改变-我认为他们不想假设它是基于报头的什么类型的请求,而是希望您在路由中定义它,或者让您手动添加侦听器。不管怎样,希望这个解决方案对您有效…至少它没有太多额外的代码。