如何扩展Symfony 3.3错误处理?重写CLI异常输出逻辑
解决Symfony 3.3 CLI环境下异常输出混乱的问题
我太懂你这个痛点了——单元测试出bug时CLI狂刷几千行HTML,完全没法快速定位问题。既然你已经搞定了services.yml的配置报错,接下来只需要完善MyExceptionController的逻辑,就能实现CLI环境下的简洁异常输出,同时丝毫不影响Web请求的原有错误处理。
完整的MyExceptionController实现
直接继承Symfony自带的ExceptionController,重写showAction方法来区分CLI和Web环境:
<?php // AppBundle/Controller/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 { public function showAction( Request $request, FlattenException $exception, DebugLoggerInterface $logger = null ): Response { // 判断当前是否为CLI环境 if ($request->isCli()) { // 提取关键异常信息,生成简洁的文本输出 $output = sprintf( "❌ 错误发生:\n状态码: %d\n异常类: %s\n错误消息: %s\n\n", $exception->getStatusCode(), $exception->getClass(), $exception->getMessage() ); // 如果开启debug模式,追加栈追踪信息(按需选择) if ($this->debug) { $output .= "📋 栈追踪:\n" . $exception->getTraceAsString() . "\n"; } // 返回纯文本响应,避免HTML渲染 return new Response($output, $exception->getStatusCode(), [ 'Content-Type' => 'text/plain' ]); } // Web环境下直接调用父类方法,保留原有HTML错误页逻辑 return parent::showAction($request, $exception, $logger); } }
关键细节说明
- 环境判断:用
$request->isCli()比直接检查PHP_SAPI更贴合Symfony的请求上下文,判断更准确。 - 信息简化:CLI下只输出最核心的错误信息,彻底告别冗余HTML;debug模式下可选择性追加栈追踪,兼顾调试需求。
- 兼容原有逻辑:Web请求完全复用Symfony默认的错误页渲染,不需要额外修改任何Web端的错误处理配置。
验证效果
现在运行你的单元测试,当出现bug时,CLI会输出类似这样的简洁文本:
❌ 错误发生: 状态码: 500 异常类: AppBundle\Exception\DbConnectionException 错误消息: 无法连接到数据库服务器 📋 栈追踪: #0 /Projects/rest_api/src/AppBundle/Service/DbService.php(38): AppBundle\Service\DbService->establishConnection() #1 /Projects/rest_api/src/AppBundle/Controller/ApiController.php(22): AppBundle\Service\DbService->fetchUserList() ...
这样既解决了CLI下输出混乱的问题,又完全保留了Web端的原有错误处理体验。
内容的提问来源于stack exchange,提问作者phpguru
相关产品推荐
相关产品推荐

