Digamos que temos 2 extensões TYPO3, cada uma contendo um plugin Extbase e cada uma fornecendo uma configuração YAML do roteador:
# 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'
Agora temos 2 páginas, cada uma contendo um dos plugins:
- Na página1 o plugin "Checkout" está localizado:
my-site.net/page1/buchen/how-to-code-course
- Na página2 o plugin "CheckoutXxx" está localizado:
my-site.net/page2/buchen/how-to-code-course
O problema
Abrir o URL da página1 resulta em erro, pois CheckoutController::orderNewAction(Course $course)
falta o $course
parâmetro! Parece que a configuração da rota /buchen/{course-name}
de "mzext_zzz" é usada (ou substitui a primeira definição). Mas por que? O roteador não leva extension: mzext_zzz
em plugin: CheckoutXxx
consideração a definição da rota?
Ou em outras palavras: como é possível que a rota /buchen/{course-name}
possa ser utilizada por dois plugins completamente diferentes de duas extensões diferentes?
Contanto que apenas um dos plug-ins conflitantes esteja em uma página, você precisa limitar a rota do plug-in a páginas específicas usando a
limitToPages
opção de definição do plug-in (veja abaixo)No entanto, isso não é dinâmico, então você precisa escrevê-lo codificado no SiteConfig
config.yaml
. Desde o TYPO3 v12 existem eventos (carregamento/gravação de siteconfig) que você pode usar para preencher limitToPages dinamicamente.Outra abordagem que você pode usar é escrever dinamicamente um subarquivo, por exemplo, na página/elemento de conteúdo salvo e coletar todos os IDs de página para o plugin personalizado e escrever o arquivo específico (com base em um modelo) - e incluir o gerado (limpando o cache sobre mudanças).
Se não estou totalmente errado, há uma extensão fazendo algumas coisas dinâmicas/estendendo o intensificador de rota principal para definir limitToPages dinamicamente.
[1] https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Routing/AdvancedRoutingConfiguration.html