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

