假设我们有 2 个 TYPO3 扩展,每个扩展都包含一个 Extbase 插件,并且每个扩展都提供路由器 YAML 配置:
# Route config for myext_aaa which contains the Extbase plugin "Checkout" using CheckoutController
routeEnhancers:
MyextAaaCheckout:
type: Extbase
extension: myext_aaa
plugin: Checkout
routes:
-
routePath: '/{localized-order-new}/{course-name}'
_controller: 'Checkout::newOrder'
_arguments:
course-name: 'course'
aspects:
course-name:
type: PersistedAliasMapper
tableName: my_course_table
routeFieldName: slug
localized-order-new:
type: LocaleModifier
default: 'order'
localeMap:
- locale: 'de_DE.*'
value: 'buchen'
# Route config for myext_zzz which contains the Extbase plugin "CheckoutXxx" using CheckoutXxxController
routeEnhancers:
MyextZzzCheckoutXxx:
type: Extbase
extension: mzext_zzz
plugin: CheckoutXxx
routes:
-
routePath: '/{zzz-localized-order-new}/{course-name}'
_controller: 'CheckoutXxx::newOrder'
_arguments:
course-name: 'course'
aspects:
course-name:
type: PersistedAliasMapper
tableName: my_course_table
routeFieldName: slug
zzz-localized-order-new:
type: LocaleModifier
default: 'order'
localeMap:
- locale: 'de_DE.*'
value: 'buchen'
现在我们有 2 个页面,每个页面包含一个插件:
- 在第 1 页,插件“Checkout”位于:
my-site.net/page1/buchen/how-to-code-course
- 在第 2 页上,插件“CheckoutXxx”位于:
my-site.net/page2/buchen/how-to-code-course
问题
打开 page1 的 URL 会导致错误,因为CheckoutController::orderNewAction(Course $course)
缺少$course
参数!似乎/buchen/{course-name}
使用了“mzext_zzz”中的路由配置(或覆盖第一个定义)。但为什么?路由器是否没有extension: mzext_zzz
考虑plugin: CheckoutXxx
路由定义?
或者换句话说:该路由怎么可能/buchen/{course-name}
被来自两个不同扩展的两个完全不同的插件使用?
只要一页上只有一个冲突插件,您就需要使用
limitToPages
插件定义选项将插件路由限制到特定页面(见下文)但是,这不是动态的,因此您需要将其硬编码到 SiteConfig 中
config.yaml
。从 TYPO3 v12 开始,您可以使用一些事件(siteconfig 加载/写入)来动态填充 limitToPages。您可以使用的另一种方法是动态编写子文件,例如在页面/内容元素上保存和收集自定义插件的所有页面 ID 并编写特定文件(基于模板) - 并包含生成的文件(清除缓存)关于变化)。
如果我没有完全错的话,有一个扩展可以做一些动态的事情/扩展核心路由增强器来动态定义 limitToPages 。
[1] https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Routing/AdvancedRoutingConfiguration.html