我正在深入研究一个相当复杂的项目中的路线配置,我很难理解其中的一个方面。在https://docs.typo3.org/typo3cms/extensions/core/latest/Changelog/9.5/Feature-86365-RoutingEnhancersAndAspects.html的示例中,“limitToPages”参数似乎非常重要。但是,如何在不与其他插件或扩展产生冲突的情况下,为所有放置插件的页面获取路由?一个例子:我有一个事件和 pois 插件。两者都有一个带有分页的列表视图。到目前为止我的配置是:
PoiPlugin:
type: Extbase
extension: supervendor
plugin: pois
routes:
- { routePath: '/{page}', _controller: 'POI::list', _arguments: {'page': '@widget_0/currentPage'} }
- { routePath: '/{poi_title}', _controller: 'POI::show', _arguments: {'poi_title': 'item'} }
defaultController: 'POI::list'
defaults:
page: '0'
requirements:
page: '\d+'
poi_title: '^[a-zA-Z0-9]'
aspects:
page:
type: StaticRangeMapper
start: '1'
end: '100'
poi_title:
type: PersistedAliasMapper
tableName: 'tx_supervendor_domain_model_poi'
routeFieldName: 'path_segment'
EventPlugin:
type: Extbase
extension: supervendor
plugin: events
routes:
- { routePath: '/{page}', _controller: 'Event::list', _arguments: {'page': '@widget_0/currentPage'} }
- { routePath: '/{event_title}', _controller: 'Event::show', _arguments: {'event_title': 'item'} }
defaultController: 'Event::list'
defaults:
page: '0'
requirements:
page: '\d+'
event_title: '^[a-zA-Z0-9]'
aspects:
page:
type: StaticRangeMapper
start: '1'
end: '100'
event_title:
type: PersistedAliasMapper
tableName: 'tx_supervendor_domain_model_event'
routeFieldName: 'path_segment'
现在的问题是,即使我将这些插件放在不同的页面上,它们似乎也有冲突。因为分页链接总是采用 config.yaml 中要提到的第一个插件的命名空间。因此,如果首先提到 PoiPlugin,则 pois 页面上的分页使用“page”参数,但事件没有。如果我更改顺序,事件会起作用,但 pois 不会。我的假设是,路由基础始终是嵌入插件的页面。我希望你们能理解我的意思。现在唯一有效的配置是,当我将 routePaths 更改为
- { routePath: '/pois/{page}', _controller: 'POI::list', _arguments: {'page': '@widget_0/currentPage'} }
和
- { routePath: '/events/{page}', _controller: 'Event::list', _arguments: {'page': '@widget_0/currentPage'} }
而且我确实理解为什么路由器必须有某种锚来识别要选择的 routePath。但我不想告诉作者,放置 PoiPlugin 的每个页面都必须命名为“Pois”。我不想限制作者在哪里以及如何使用插件,所以我不想使用 limitToPages 属性或预定义的路由前缀。那么还有其他可能解决这个问题吗?
更新:解决方案 现在我通过在 routePath 中的 {page} 参数之前添加前缀解决了这个问题。我的配置似乎只有分页小部件有问题,其他一切都很好。例如,列表路由现在看起来像这样:
- { routePath: '/e_{page}', _controller: 'Event::list', _arguments: {'page': '@widget_0/currentPage'} }
- { routePath: '/p_{page}', _controller: 'POI::list', _arguments: {'page': '@widget_0/currentPage'} }