有没有使用twig处理symfony错误的方法?

时间:2015-12-11 14:24:33

标签: php symfony

我现在正在使用FOSRestBundle处理JSON API。我在处理API的路由间距之外的错误时遇到了一些麻烦,因为Symfony似乎一心要求Twig才能捕获HttpException,而且除了dev控制器之外我显然没有使用twig(对于网络调试工具)。

最终结果是,当我在使用prod控制器时尝试访问未通过路由处理的任何资源而不是404时,我遇到了500个错误。这很难看。使用开发控制器时会返回正确的http代码,因为Twig在其上处于活动状态。

我如何利用symfony来处理错误,而不需要在生产时启用Twig,而不是在prod控制器上捕获异常?

1 个答案:

答案 0 :(得分:1)

是的!如果我正确理解您的用例,您可以创建自定义异常控制器:

  1. 重新定义twig.controller.exception.class参数
  2. 创建自定义控制器
  3. 以下是我的一个项目的例子:

    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()方法中轻松实现。

    希望这会有所帮助:)