Composer从1升级到2后出现PSR-4自动加载错误求助
Composer 1升级到2后PSR-4自动加载错误解决
问题
升级Composer至2.x版本后,出现自动加载错误:
类moduleNema\twigExtensions\NemaTwigExtension不符合PSR-4自动加载标准,被跳过。
目录结构
modules -> modulesNema -> controllers -> services -> Dark.php -> Rent.php -> twigExtensions -> NemaTwigExtensions.php -> Module.php -> Module.php
相关代码
NemaTwigExtensions.php
<?php namespace moduleNema\twigExtensions; use moduleNema\services\Dark; use moduleNema\services\Rent; class NemaTwigExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface { public function getGlobals() { return array( 'nema' => array( 'dark' => new Dark(), 'rent' => new Rent() ) ); } }
Module.php
<?PHP namespace moduleNema; use moduleNema\twigExtensions\NemaTwigExtension as NemaTwigExtension; use Craft; use craft\services\Elements; use yii\base\Event; class Module extends \yii\base\Module { public function init() { parent::init(); Event::on(Elements::class, Elements::EVENT_AFTER_SAVE_ELEMENT, function(Event $event) { }); if (Craft::$app->request->getIsSiteRequest()) { // Add in our Twig extension $extension = new NemaTwigExtension(); Craft::$app->view->registerTwigExtension($extension); } } }
Composer配置
"autoload": { "psr-4": { "modules\\": "modules/", "moduleNema\\": "modules/moduleNema" }, },
解决步骤
1. 修正Composer命名空间映射路径
当前Composer配置中moduleNema指向的路径是modules/moduleNema,但实际目录是modules/modulesNema(多了一个s),修改配置为:
"autoload": { "psr-4": { "modules\\": "modules/", "moduleNema\\": "modules/modulesNema" }, },
2. 修正类文件名与类名匹配
PSR-4要求类文件名必须与类名完全一致,当前类名为NemaTwigExtension,但文件名是NemaTwigExtensions.php(多了一个s),将文件名改为NemaTwigExtension.php。
3. 重新生成自动加载文件
执行以下命令更新Composer自动加载缓存:
composer dump-autoload -o
原因说明
Composer 1.x对PSR-4规范的检查较为宽松,部分不匹配的情况不会触发错误;而Composer 2.x严格执行PSR-4标准,目录与命名空间映射、文件名与类名的不一致都会导致自动加载失败。
内容的提问来源于stack exchange,提问作者Ledif
相关产品推荐
相关产品推荐

