如何在PHPWord PDF渲染器中设置PSR Logger 3版本并解决兼容错误
解决PHPWord+MPDF的PSR Logger版本冲突问题
错误原因分析
这个编译错误源于PSR-Log组件版本不兼容:
- PSR-Log 2.0+版本中,
NullLogger::log()方法的$message参数新增了Stringable|string类型声明 - 旧版(1.x)
LoggerInterface::log()的参数无类型约束,当Composer加载了不同版本的PSR-Log文件时,就会触发方法声明不兼容的冲突
解决步骤
1. 统一PSR-Log版本
先执行命令查看当前安装的PSR-Log版本:
composer show psr/log
在composer.json的require节点添加明确的版本约束(PHPWord v0.18+和MPDF v8+均支持2.x或3.x版本):
"psr/log": "^2.0 || ^3.0"
执行更新命令让Composer统一版本:
composer update psr/log
2. 修正PHPWord的PDF渲染器路径
你之前的setPdfRendererPath设置错误,正确路径应指向MPDF的安装目录,而非PHPWord的PDF.php文件:
// 指向MPDF的安装根目录 \PhpOffice\PhpWord\Settings::setPdfRendererPath($_SERVER["DOCUMENT_ROOT"] . '/local/vendor/mpdf/mpdf'); // 指定使用MPDF作为PDF渲染器 \PhpOffice\PhpWord\Settings::setPdfRendererName(\PhpOffice\PhpWord\Settings::PDF_RENDERER_MPDF);
3. 用PsrLogAwareTrait配置自定义Logger
通过PsrLogAwareTrait可以给PHPWord组件注入自定义Logger,避免依赖默认Logger的版本问题:
use Psr\Log\LoggerAwareTrait; use Psr\Log\NullLogger; // 自定义支持Logger注入的Writer类 class CustomPdfWriter extends \PhpOffice\PhpWord\Writer\PDF { use LoggerAwareTrait; public function __construct(\PhpOffice\PhpWord\PhpWord $phpWord) { parent::__construct($phpWord); // 默认使用NullLogger,也可替换为Monolog等实际日志组件 $this->setLogger(new NullLogger()); } } // 使用示例 $phpWord = new \PhpOffice\PhpWord\PhpWord(); $pdfWriter = new CustomPdfWriter($phpWord); // 若有实际Logger实例,可直接注入 // $logger = new \Monolog\Logger('phpword_log'); // $pdfWriter->setLogger($logger);
也可以直接给PHPWord核心类注入Logger(PhpWord类已实现LoggerAwareInterface):
$phpWord = new \PhpOffice\PhpWord\PhpWord(); $phpWord->setLogger(new \Psr\Log\NullLogger());
验证
完成上述操作后重新运行代码,即可消除PSR-Log的方法兼容错误。
内容的提问来源于stack exchange,提问作者Dux
相关产品推荐
相关产品推荐

