如何让tx_seo生成的站点地图借助RouteEnhancers生成友好URL?
我用tx_seo为扩展「myext」生成的站点地图可正常运行,但生成的链接是带查询参数的格式:
http://domain.local/detail?tx_myext_pi1[action]=list&tx_myext_pi1[controller]=Read&tx_myext_pi1[uid]=333&cHash=4d4...
期望生成的是友好URL:
http://domain.local/detail/title-of-record-333
我已经在sites/mysite/config.yaml里定义了路由配置,能不能直接用其中的RouteEnhancers让站点地图生成友好URL?我不想新建SitemapDataProvider类,那样会重复代码还可能和配置有差异,想直接复用现有配置。
我的config.yaml配置如下:
routeEnhancers: PageTypeSuffix: type: PageType map: sitemap.xml: 1533906435 MyPlugin: type: Extbase extension: MyExt plugin: Pi1 defaultController: 'Mycontroller::list' limitToPages: [12345] routes: - routePath: '/mypath/{question}/{tab}/{theme}' _controller: 'Mycontroller::show' aspects: question: type: PersistedAliasMapper tableName: tx_myext_domain_model_question routeFieldName: path_segment theme: type: PersistedAliasMapper tableName: tx_myext_domain_model_theme routeFieldName: name tab: type: StaticRangeMapper start: '1' end: '3'
可以直接复用现有RouteEnhancers配置让tx_seo生成友好URL的站点地图,核心是让路由配置覆盖站点地图用到的控制器/动作,同时确保tx_seo调用TYPO3路由解析器生成链接,具体调整步骤如下:
补充站点地图对应动作的路由规则
你的现有路由仅配置了Mycontroller::show动作,但站点地图用到的是Read::list,需要在routes节点新增对应动作的路由规则,匹配你期望的友好URL格式:routes: - routePath: '/mypath/{question}/{tab}/{theme}' _controller: 'Mycontroller::show' # 新增站点地图目标动作的路由规则 - routePath: '/detail/{question}' _controller: 'Read::list'这里的
routePath对应你想要的/detail/title-of-record-333格式,{question}关联到已配置的别名映射。确认Aspect映射匹配
你已配置question的PersistedAliasMapper,只要tx_myext_domain_model_question表的path_segment字段存储了title-of-record-333这类别名,就能自动完成uid到别名的映射。如果站点地图生成依赖其他字段,可新增对应Aspect配置。验证路由覆盖范围
- 确保
limitToPages包含站点地图关联的页面ID(如果插件部署在页面12345,且站点地图基于该页面生成,当前配置已满足) - 修改路由配置后必须清除TYPO3缓存,否则新配置不会生效
- 确保
检查SitemapDataProvider配置
若使用tx_seo默认的ExtbaseXmlSitemapDataProvider,需确保其配置正确关联到你的扩展、插件和动作,这样才能匹配到RouteEnhancers:# 在config.yaml的tx_seo节点下补充配置 tx_seo: config: xmlSitemap: sitemaps: myext: provider: TYPO3\CMS\Seo\XmlSitemap\ExtbaseXmlSitemapDataProvider config: extension: Myext plugin: Pi1 controller: Read action: list # 按需添加存储库、排序等其他配置
完成以上调整后,站点地图生成时会自动复用现有RouteEnhancers配置,生成符合预期的友好URL,无需编写自定义SitemapDataProvider。
内容的提问来源于stack exchange,提问作者yogi

