TYPO3 12 ActionController注册插件时触发ServiceNotFoundException
注册TYPO3插件时出现ServiceNotFoundException错误
错误信息
ServiceNotFoundException: You have requested a non-existent service "MyVendorName\Typo3StarterSitepackage\Controller\DummyController"
环境信息
- 系统:Windows + XAMPP
- PHP版本:8.2
- TYPO3版本:12.4.10
相关代码
控制器代码(DummyController.php)
<?php namespace MyVendorName\Typo3StarterSitepackage\Controller; use Psr\Http\Message\ResponseInterface; class DummyController extends ActionController { public function dummyListAction(): ResponseInterface { return $this->htmlResponse(); } }
仓库代码(DummyRepository.php)
<?php namespace MyVendorName\Typo3StarterSitepackage\Domain\Repository; use TYPO3\CMS\Extbase\Persistence\QueryInterface; class DummyRepository extends Repository { // this already has some default functions, like findAll(), inherited from the Repository class. }
Services.yaml
services: # general settings _defaults: autowire: true autoconfigure: true public: false MyVendorName\Typo3StarterSitepackage\: resource: '../Classes/*'
ext_localconf.php
<?php use MyVendorName\Typo3StarterSitepackage\Controller\DummyController; use TYPO3\CMS\Extbase\Utility\ExtensionUtility; defined('TYPO3') or die('Access denied.'); /*************** * Add default RTE configuration */ // $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['typo3_starter_sitepackage'] = 'EXT:typo3_starter_sitepackage/Configuration/RTE/Default.yaml'; /*************** * PageTS */ \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:typo3_starter_sitepackage/Configuration/TsConfig/Page/All.tsconfig">'); ExtensionUtility::configurePlugin( 'typo3_starter_sitepackage', 'DummyList', [DummyController::class => 'dummyList'], );
排查与解决方案
补全父类引入
控制器和仓库未引入对应的父类,导致类无法正确加载,服务无法被DI容器识别。- 修改控制器代码,添加父类引入:
<?php namespace MyVendorName\Typo3StarterSitepackage\Controller; use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; // 新增该行 class DummyController extends ActionController { public function dummyListAction(): ResponseInterface { return $this->htmlResponse(); } } - 修改仓库代码,添加父类引入:
<?php namespace MyVendorName\Typo3StarterSitepackage\Domain\Repository; use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Persistence\Repository; // 新增该行 class DummyRepository extends Repository { // 继承的默认方法如findAll()可用 }
- 修改控制器代码,添加父类引入:
验证文件路径与命名空间匹配
确认控制器文件路径为Classes/Controller/DummyController.php,仓库文件路径为Classes/Domain/Repository/DummyRepository.php,路径结构需与命名空间完全对应,注意大小写(TYPO3的PSR-4自动加载严格区分大小写,Windows文件系统不区分但需保持一致)。清理TYPO3缓存
在后端执行「清除全部缓存」,或通过命令行运行typo3 cache:flush,确保DI容器重新生成服务定义。检查扩展密钥一致性
确认ExtensionUtility::configurePlugin的第一个参数typo3_starter_sitepackage与ext_emconf.php中的extension_key完全一致。Windows环境额外检查
- 扩展目录名称需与扩展密钥一致,避免大小写差异导致自动加载失败。
- 禁用PHP的
opcache或配置其自动重新加载文件,避免旧缓存类影响服务识别。
内容的提问来源于stack exchange,提问作者Lyshatt
相关产品推荐
相关产品推荐

