我现在正在使用FOSRestBundle处理JSON API。我在处理API的路由间距之外的错误时遇到了一些麻烦,因为Symfony似乎一心要求Twig才能捕获HttpException
,而且除了dev控制器之外我显然没有使用twig(对于网络调试工具)。
最终结果是,当我在使用prod控制器时尝试访问未通过路由处理的任何资源而不是404时,我遇到了500个错误。这很难看。使用开发控制器时会返回正确的http代码,因为Twig在其上处于活动状态。
我如何利用symfony来处理错误,而不需要在生产时启用Twig,而不是在prod控制器上捕获异常?
答案 0 :(得分:1)
是的!如果我正确理解您的用例,您可以创建自定义异常控制器:
twig.controller.exception.class
参数以下是我的一个项目的例子:
在app/config/services.yml
或适合您项目的任何地方,添加:
parameters:
twig.controller.exception.class: AppBundle\Controller\ExceptionController
然后创建自定义控制器src/AppBundle/Controller/ExceptionController.php
:
<?php
namespace AppBundle\Controller;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
/**
* ExceptionController
*
* Override standard exceptions
* in production env with basic
* json response codes.
*
* @see app/config/services.yml
*/
class ExceptionController extends BaseExceptionController
{
/**
* {@inheritdoc}
*/
public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
{
if ($request->attributes->get('showException', $this->debug)) {
return parent::showAction($request, $exception, $logger);
}
return new JsonResponse(null, $exception->getStatusCode());
}
}
在我的项目中,这会在prod中返回{}
和相应的HTTP响应代码。显然,您的用例可能需要不同的逻辑,您可以在自定义ExceptionController::showAction()
方法中轻松实现。
希望这会有所帮助:)