TYPO3扩展开发:Composer自动加载无法识别自定义类
问题背景
开发TYPO3扩展时,遇到Composer自动加载器无法识别自定义类的问题,目标是通过Extbase获取数据并传递给Fluid模板。
扩展配置文件
composer.json
{ "name": "toumeh/mywebsite", "description": "my Website", "type": "typo3-cms-extension", "license": "GPL-2.0-or-later", "authors": [ { "name": "toumeh", "email": "toumeh@gmail.com" } ], "require": { "typo3/cms-fluid-styled-content": "^12.4.0", "ext-pdo": "*" }, "autoload": { "psr-4": { "MyWebsite\\Classes\\": "Classes/" } }, "extra": { "typo3/cms": { "extension-key": "mywebsite" } } }
ext_localconf.php
use MyWebsite\Classes\Controller\MyWebsiteController; use MyWebsite\Classes\Domain\PageRepository; use TYPO3\CMS\Extbase\Utility\ExtensionUtility; ExtensionUtility::configurePlugin( MyWebsiteController::EXTENSION_NAME, MyWebsiteController::PLUGIN_NAME, [ MyWebsiteController::CONTROLLER_NAME => PageRepository::PAGES ] );
报错信息
Class "MyWebsite\Classes\Controller\MyWebsiteController" not found
in /var/www/t3coredev/packages/mywebsite/ext_localconf.php line 11
use MyWebsite\Classes\Domain\PageRepository;use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
ExtensionUtility::configurePlugin(MyWebsiteController::EXTENSION_NAME,MyWebsiteController::PLUGIN_NAME,[MyWebsiteController::CONTROLLER_NAME => PageRepository::PAGES]
已尝试操作
- 执行
composer dump-autoload,无效 - 根composer已包含
"typo3/cms-extbase": "^12.4.0" - 确认无文件权限问题
环境与项目结构
- TYPO3 Composer版本:12.4.8
- 项目结构:扩展目录
packages/mywebsite下包含Classes/Controller/MyWebsiteController.php、Classes/Domain/PageRepository.php,以及ext_localconf.php、ext_tables.php、composer.json等核心文件。
问题分析与解决步骤
核心问题:PSR-4命名空间配置错误
你的composer.json中PSR-4自动加载规则配置错误,导致Composer无法正确映射类文件路径与命名空间。当前配置将MyWebsite\Classes\指向Classes/目录,这会让Composer寻找类时在Classes/Classes/路径下查找,与实际结构不符。
解决步骤
修正composer.json的自动加载配置
将autoload部分的PSR-4规则修改为:"autoload": { "psr-4": { "MyWebsite\\": "Classes/" } }此配置表示
MyWebsite\命名空间下的类对应Classes/目录,例如MyWebsite\Controller\MyWebsiteController会映射到Classes/Controller/MyWebsiteController.php。修正类文件的命名空间
打开Classes/Controller/MyWebsiteController.php,确保命名空间为:namespace MyWebsite\Controller;同理,
Classes/Domain/PageRepository.php的命名空间应为:namespace MyWebsite\Domain;修正ext_localconf.php的use语句
将use语句修改为正确的命名空间:use MyWebsite\Controller\MyWebsiteController; use MyWebsite\Domain\PageRepository; use TYPO3\CMS\Extbase\Utility\ExtensionUtility;更新Composer自动加载缓存
在项目根目录执行:composer dump-autoload清除TYPO3缓存
通过TYPO3后端的缓存清理功能,或执行命令行命令:./vendor/bin/typo3 cache:flush
完成以上步骤后,Composer应该能正确识别你的自定义类,插件配置也能正常生效。
内容的提问来源于stack exchange,提问作者Naseem Toumeh

