Typo3 v9 routeEnhancers配置失效致404,求解决方案
我刚接触TYPO3做Extbase插件时,也在路由增强这块踩过不少坑,结合你描述的情况,咱们一步步排查你可能遗漏的配置点:
1. 路由增强器类型选错了
你当前用的type: Plugin是给非Extbase的传统插件用的,而你的插件是Extbase类型(从命名空间tx_providercompass_aboutus能看出来),必须切换为type: Extbase,这是最核心的问题!
2. 命名空间/扩展&插件Key必须完全匹配
TYPO3 Extbase插件的路由命名空间格式是tx_<扩展key>_<插件key>,不能随便去掉tx_前缀。你需要先确认自己的插件注册信息:
打开扩展根目录的ext_localconf.php,找到configurePlugin的代码,比如:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin( 'Providercompass', // 扩展名称(和composer.json里的name对应,小写) 'Aboutus', // 插件Key(注意大小写要和路由配置一致) [ \YourVendor\Providercompass\Controller\ProviderController::class => 'show,listJobs', ], [] );
对应的路由配置里,extension要填扩展的小写Key(比如providercompass),plugin要填插件的Key(比如aboutus)。
3. 参数正则表达式太严格
你当前的requirements: { provider: '[0-9]' }只能匹配单个数字(比如/provider/1),但你要访问的是/provider/123(多位数),必须改成:
requirements: provider: '\d+' # \d+ 匹配1个或多个数字
4. Extbase路由需要绑定控制器动作
如果用Extbase类型的路由增强,必须明确指定路由对应的控制器动作,以及URL参数和控制器参数的映射关系。比如你要实现/provider/{id}/{name}/jobs,可以这样配置:
routeEnhancers: ProviderCompass: type: Extbase limitToPages: [28] extension: providercompass plugin: aboutus routes: # 先搞定基础的/provider/{id},再扩展到带name和jobs的路由 - routePath: '/provider/{providerId}' _controller: 'Provider::show' _arguments: providerId: 'provider' # 再添加你想要的完整路由 - routePath: '/provider/{providerId}/{providerName}/jobs' _controller: 'Provider::listJobs' _arguments: providerId: 'provider' providerName: 'name' requirements: providerId: '\d+' providerName: '[a-zA-Z0-9\-]+' # 匹配字母、数字、连字符 defaults: providerName: '' # 如果name参数是可选的,可以设置默认值
5. 缓存清除要彻底
TYPO3的路由缓存有时候很顽固,别只点后台的“Flush frontend caches”,一定要选**“Flush all caches”**(包括配置缓存和系统缓存),甚至可以手动删除var/cache目录下的文件。
6. 检查页面ID限制
你的limitToPages: [28]意味着这个路由只在ID为28的页面生效,如果你访问的页面不是28,肯定会404。可以先暂时注释掉这一行,测试路由是否正常,再重新添加页面限制。
最后验证控制器参数
确保你的控制器动作里接收了对应的参数,比如:
namespace YourVendor\Providercompass\Controller; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class ProviderController extends ActionController { public function showAction(int $provider) { // 处理逻辑 $this->view->assign('provider', $provider); } public function listJobsAction(int $provider, string $name = '') { // 处理带name和jobs的逻辑 } }
按上面的步骤调整后,再测试/provider/123应该就能正常访问了,之后再扩展到带name和jobs的完整路由。
内容的提问来源于stack exchange,提问作者bibamann

