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

SULU CMS:Symfony6/PHP8下maxbanton/cwh的AWS日志兼容问题解决

问题描述

我开发了一个基于Sulu CMS v2.5.10的项目,将Symfony升级至v6、PHP升级至v8.2后,项目中引入的maxbanton/cwh v2.0.4组件触发了如下PHP致命错误:

!! PHP Fatal error: Declaration of Maxbanton\Cwh\Handler\CloudWatch::write(array $record): void must be compatible with Monolog\Handler\AbstractProcessingHandler::write(Monolog\LogRecord $record): void in /var/www/html/vendor/maxbanton/cwh/src/Handler/CloudWatch.php on line 164
!! PHPERROR:
!! Fatal error: Declaration of Maxbanton\Cwh\Handler\CloudWatch::write(array $record): void must be compatible with Monolog\Handler\AbstractProcessingHandler::write(Monolog\LogRecord $record): void in /var/www/html/vendor/maxbanton/cwh/src/Handler/CloudWatch.php on line 164
!! Symfony\Component\ErrorHandler\Error\FatalError {#8833
!! #message: "Compile Error: Declaration of Maxbanton\Cwh\Handler\CloudWatch::write(array $record): void must be compatible with Monolog\Handler\AbstractProcessingHandler::write(Monolog\LogRecord $record): void"
!! #code: 0
!! #file: "./vendor/maxbanton/cwh/src/Handler/CloudWatch.php"
!! #line: 164
!! -error: array:4 [
!! "type" => 64
!! "message" => "Declaration of Maxbanton\Cwh\Handler\CloudWatch::write(array $record): void must be compatible with Monolog\Handler\AbstractProcessingHandler::write(Monolog\LogRecord $record): void"
!! "file" => "/var/www/html/vendor/maxbanton/cwh/src/Handler/CloudWatch.php"
!! "line" => 164
!! ]
!! }

解决方案

错误根源是maxbanton/cwh v2.0.4与Symfony 6依赖的Monolog 3.x版本不兼容:Monolog 3.x将日志记录的参数类型从数组改为Monolog\LogRecord对象,而旧版组件仍使用数组类型声明write方法,导致接口匹配失败。

以下是可行的解决方法:

  • 升级maxbanton/cwh到兼容版本
    该组件的v3.x版本已适配Monolog 3.x,执行Composer命令升级:

    composer require maxbanton/cwh:^3.0
    

    注意:升级后需调整CloudWatch Handler的初始化代码,v3.x的API有变更(如构造参数、配置方式),需同步修改项目中的相关实现。

  • 临时兼容修改(不推荐长期使用)
    若暂时无法升级组件,可修改vendor/maxbanton/cwh/src/Handler/CloudWatch.php的write方法,兼容数组和LogRecord对象:

    public function write(Monolog\LogRecord|array $record): void
    {
        // 将LogRecord对象转为数组
        if ($record instanceof Monolog\LogRecord) {
            $record = $record->toArray();
        }
        // 保留原方法的业务逻辑
        // ...
    }
    

    注意:直接修改vendor目录文件会被Composer更新覆盖,建议使用cweagans/composer-patches工具生成补丁维护该修改。

  • 降级Monolog到2.x版本
    若上述方案不可行,可临时降级Monolog到2.x以适配旧版组件:

    composer require monolog/monolog:^2.0
    

    但此方法可能影响Symfony 6的其他依赖兼容性,需全面测试。


内容的提问来源于stack exchange,提问作者Srdjan Mish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:22:05