You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:57:08