[英]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.