繁体   English   中英

如何扩展Symfony 3错误处理?

[英]How to extend Symfony 3 Error Handling?

我正在尝试扩展Symfony 3.3内置的错误处理程序,以覆盖它在CLI上所做的工作,但是将现有行为保留在适当的位置以用于Web请求。

每当我在Symfony的单元测试中遇到错误时,它都会向CLI吐出3000行HTML。 这真是愚蠢。

因此,我尝试遵循文档以扩展内置的错误处理。

我加了

services:
    _defaults:
        autowire: true

   twig.exception_listener:
       class:  AppBundle\Controller\MyExceptionController
       public: true
       arguments: "%kernel.debug%"

就像文档中显示的一样,Symfony抱怨:

Type error: Argument 1 passed to Symfony\\Component\\DependencyInjection\\Definition::setArguments() must be of the type array, string given, called in /Projects/rest_api/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php on line 425

因此,在另一个堆栈溢出页面上,我发现您还必须通过Twig。

现在我在services.yml中有这个

   twig.exception_listener:
       class:  AppBundle\Controller\MyExceptionController
       public: true
       arguments: ["@twig", "%kernel.debug%"]

到现在为止还挺好。 这是MyExceptionController:

 <?php // AppBundle/Controllers/MyExceptionController.php namespace AppBundle\\Controller; use Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController; use Symfony\\Component\\Debug\\Exception\\FlattenException; use Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface; use Symfony\\Component\\HttpFoundation\\Request; use Symfony\\Component\\HttpFoundation\\Response; class MyExceptionController extends ExceptionController { /** * Converts an Exception to a Response. * * A "showException" request parameter can be used to force display of an error page (when set to false) or * the exception page (when true). If it is not present, the "debug" value passed into the constructor will * be used. * * @param Request $request * @param FlattenException $exception * @param DebugLoggerInterface|null $logger * @return Response */ public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null) { if (php_sapi_name() === 'cli') { $error = <<<EOF ------------------------------------------------------- -- ______ _____ _____ ____ _____ _ -- | ____| __ \\| __ \\ / __ \\| __ \\| | -- | |__ | |__) | |__) | | | | |__) | | -- | __| | _ /| _ /| | | | _ /| | -- | |____| | \\ \\| | \\ \\| |__| | | \\ \\|_| -- |______|_| \\_\\_| \\_\\\\____/|_| \\_(_) -- -------------------------------------------------------- EOF; $error .= "\\n".print_r($exception, true)."\\n"; return $error; } else { return parent::showAction($request, $exception, $logger); } } } 

这是奇怪的事情。 我在浏览器中获得默认的HTML错误页面,并且HTML脱离了CLI,但是我没有看到我的代码被调用。 即使将die('Got Here')放在showAction()方法的顶部,也永远不会调用它。

我回去几次重新阅读了文档。 我尝试了这个:

# app/config/config.yml
twig:
    exception_controller: AppBundle:MyExceptionController:showAction

依然没有。 它似乎根本没有作用。

那么,这里出了什么问题?

您为什么还要尝试渲染它的CLI? CLI完全是关于命令的,控制器不应该成为命令的一部分,而控制器也不能成为命令的一部分,因为没有请求/响应,而是具有stdin和stdout。

如果要为命令使用异常处理程序,则应使用ConsoleEvents :: ERROR 但这不应该是应用程序的标准流程,最好使用try,catch,finally来实际捕获异常并做出相应的反应

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM