自定义 TYPO3 扩展的路径如下所示:
我希望它们看起来像: https://example.com/events/detail/event-title/test-event/
routeEnhancer 配置如下所示:
routeEnhancers:
EventDetail:
type: Plugin
routePath: '/event-title/{event}'
namespace: tx_eventmanager_eventdisplay
defaults:
controller: 'Event'
aspects:
event:
type: PersistedAliasMapper
tableName: tx_eventmanager_domain_model_event
routeFieldName: path_segment
TYPO3版本是11.5.34
完全相同的配置在另一个扩展(在另一个站点)中产生了所需的结果,当前的扩展是几年前从该扩展中分叉出来的。即使没有“默认值”,它也能工作,我添加了“默认值”,因为看起来它们可能会有所帮助。我尝试使用 type: Extbase 来代替,但由于某种原因,这对任何一个扩展都不起作用。
因此,两个扩展(或环境)之间似乎存在一些微小但至关重要的差异,但两者都有很大差异 - 我应该注意什么?或者我可以通过在routeEnhancer中进行一些额外的配置来修复它吗?
我已经尝试使用 ChatGPT 缩小范围,但这并没有多大帮助。 我尝试了它提供的不同的routeEnhancer配置,但这并没有改善它。 根据它的建议我进行了比较:
所有这些在两个扩展中都是相同的。 除此之外,它的建议非常广泛。
看来,您正在谈论
Extbase Plugin
并希望用说话的 url 替换 extbase 请求获取参数。
使用站点配置来定义路由是一个好的开始,也是这样做的正确位置。但是,您使用了“错误”的路由增强器。罪魁祸首是,TYPO3 知道两种类型的插件 - AbstractPlugins(基于 Pi42/旧版)和
Extbase Plugins
- 并且您需要为每种插件类型使用正确的路由增强器。
该文档解释了 Extbase 插件路由增强器 [1],您可能需要阅读它以获取进一步的解释,特别是方面部分和可能性。
粗略的开始应该使用以下路由配置:
routeEnhancers:
EventDetail:
type: Extbase
extension: Eventmanager
plugin: EventDisplay
routes:
- routePath: '/event-title/{event}'
_controller: 'Event::show'
_arguments:
event: 'event'
aspects:
event:
type: PersistedAliasMapper
tableName: tx_eventmanager_domain_model_event
routeFieldName: path_segment
注意:始终对路由路径使用前缀,并避免多个插件重复/使用相同的前缀 - 或者使用 limitToPage ,只要同一页面上不存在两个具有相同前缀的插件即可。并且您应该使用routePath前缀,如果使用tree lige slug路径(默认),它不太可能是子页面的slug。
确实不建议对 extbase 插件使用插件 Routeenhanver,因为它会满足 Extbase 的特定要求。
其他选项
如果它确实不是 extbase 插件,并且您想使用
Plugin
类型增强器,那么还有其他罪魁祸首。首先,该类型不支持方面参数映射。
所以也许以下内容适合您:
routeEnhancers:
EventDetail:
type: Plugin
routePath: '/event-title/{event}'
namespace: tx_eventmanager_eventdisplay
requirements:
event: '[a-zA-Z0-9]+'
aspects:
event:
type: PersistedAliasMapper
tableName: tx_eventmanager_domain_model_event
routeFieldName: path_segment
命名空间(完整的插件名称)和 不应与其他插件重复且是唯一的 - 并且与用于注册的扩展/插件名称相匹配。如果是这种类型,请参阅 [2] 了解说明。