Magento模块中PHP CodeSniffer无法运行的解决求助
解决Magento 2模块中PHP CodeSniffer运行报错问题
问题场景
在Magento 2模块项目中安装PHP CodeSniffer,composer.json配置如下:
{ "name": "test/myModule", "description": "testin", "type": "magento2-module", "version": "1.0.0", "require": { "php": "^8.1" }, "require-dev": { "squizlabs/php_codesniffer": "3.*", "magento/magento-coding-standard": "^31.0" }, "autoload": { "files": [ "registration.php" ], "psr-4": { "Test\\Module\\": "" } } }
执行composer update/install成功后,运行命令 vendor/bin/phpcs --standard=Magento2 ./ 时出现致命错误:
PHP Fatal error: Uncaught Error: Class "Magento\Framework\Component\ComponentRegistrar" not found in /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/registration.php:2 Stack trace: #0 /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/vendor/composer/autoload_real.php(55): require() #1 /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/vendor/composer/autoload_real.php(38): composerRequireabd7530303d7978f314768d362cfeb3f() #2 /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/vendor/autoload.php(25): ComposerAutoloaderInitabd7530303d7978f314768d362cfeb3f::getLoader() #3 /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/vendor/squizlabs/php_codesniffer/autoload.php(79): include('...') #4 /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/vendor/squizlabs/php_codesniffer/bin/phpcs(17): PHP_CodeSniffer\Autoload::load() #5 /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/vendor/bin/phpcs(120): include('...') #6 {main} thrown in /home/cloudpanel/htdocs/magento2.mgt/app/code/Test/Module/registration.php on line 2
错误原因
模块的registration.php被Composer自动加载配置加入了autoload.files列表,运行PHP CodeSniffer时Composer会自动引入该文件。但该文件依赖Magento核心的ComponentRegistrar类,在模块单独目录运行phpcs时无法加载到Magento核心类库,因此触发类不存在的致命错误。
解决方法
方法一:调整Composer自动加载配置
修改模块的composer.json,将registration.php从自动加载的files中移除,或者添加排除规则让Composer忽略该文件:
"autoload": { "psr-4": { "Test\\Module\\": "" }, "exclude-from-classmap": [ "/registration.php" ] }
修改后执行composer dump-autoload更新自动加载规则,再重新运行phpcs命令即可。
方法二:在Magento根目录运行phpcs
切换到Magento项目根目录,运行phpcs时指定模块路径,此时Magento核心类库已加载,不会出现类缺失问题:
vendor/bin/phpcs --standard=Magento2 app/code/Test/Module/
方法三:修改registration.php增加类存在检查
在模块的registration.php中添加类存在判断,避免无法加载Magento核心类时执行注册代码:
<?php if (class_exists(\Magento\Framework\Component\ComponentRegistrar::class)) { \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Test_Module', __DIR__ ); }
修改后直接重新运行phpcs命令即可。
内容的提问来源于stack exchange,提问作者footy
相关产品推荐
相关产品推荐

