在Monorepo架构中为WordPress插件配置PSR-4自动加载依赖类
问题背景
我在Monorepo架构下开发WordPress插件,目录结构如下:
packages/ ├── plugin └── dependencie-1
依赖包(dependencie-1)配置
dependencie-1的composer.json已配置PSR-4自动加载:
"autoload": { "psr-4": { "Mdorim\\": "src/php/" } }
主插件(plugin)配置
plugin的composer.json配置如下:
"autoload": { "psr-4": { "LCDR\\": "./src/php", "LCDR\\Tests\\": "./tests/Pest" } }, "repositories": [ { "type": "path", "url": "../mdorim" } ], "require": { "monorepo/mdorim": "@dev" },
主插件入口文件已引入自动加载器:
require '../vendor/autoload.php';
当前问题
主插件自身的类能正常加载,但无法加载dependencie-1的类,报错:
PHP Fatal error: Uncaught Error: Class "Mdorim\Core" not found in /var/www/html/wp-content/plugins/elucidario-art/lcdr.php:52
补充信息
PHPUnit测试环境中能正常加载依赖类,但Docker环境下不行。尝试在plugin的composer仓库配置中设置symlink: false后仍无效:
"repositories": [ { "type": "path", "url": "../mdorim", "options": { "symlink": false } } ],
排查与解决步骤
修正仓库路径匹配
检查plugin的composer仓库配置中url字段:当前配置是../mdorim,但目录结构里依赖包实际是dependencie-1,路径不匹配会导致Composer找不到依赖。需将url改为../dependencie-1。验证依赖包命名一致性
确认dependencie-1的composer.json中name字段为monorepo/mdorim,和plugin的require字段完全一致,否则Composer无法正确关联依赖。重新生成自动加载映射
在plugin目录下执行以下命令,强制更新依赖并生成优化后的自动加载文件:composer update monorepo/mdorim --no-cache composer dump-autoload -o-o参数会生成优化后的自动加载文件,避免路径解析的模糊性。Docker环境路径与权限检查
- 确认本地Monorepo的
packages目录已正确挂载到Docker容器内,容器内的路径结构和本地一致。 - 检查容器内
plugin/vendor/monorepo/mdorim目录是否存在且文件完整:设置symlink: false后,Composer应直接复制依赖文件到vendor目录而非创建软链接,若该目录为空则说明依赖未正确安装。 - 检查容器内文件权限,确保PHP进程有权限读取
vendor目录下的依赖文件。
- 确认本地Monorepo的
修正自动加载器引入路径
主插件入口文件中使用相对路径可能因环境差异导致错误,改用绝对路径引入自动加载器:require __DIR__ . '/vendor/autoload.php';__DIR__代表当前文件所在目录,能确保路径在任何环境下都正确。核对类文件与命名空间匹配
确认dependencie-1/src/php/Core.php文件存在,且类定义为namespace Mdorim; class Core { ... },PSR-4对大小写敏感,需保证文件名、类名、命名空间完全匹配。
内容的提问来源于stack exchange,提问作者hgodinho

