升级到TYPO3 v9.5.14后路由异常

M K*_*ein 4 typo3 symfony-routing tx-news typo3-9.x

升级到 TYPO3 v9.5.14 后,我们的新闻详情页面崩溃了

Symfony\Component\Routing\Exception\InvalidParameterException

路由“tx_news_pi1_1”的参数“p88bd715a41119d0e8087a5d19cb049”必须匹配“[^/]++”(“”给定)以生成相应的URL。

这是怎么回事?

该站点使用此配置:

  NewsTagPlugin:
    type: Extbase
    limitToPages: [14]
    extension: News
    plugin: Pi1
    routes:
      - routePath: '/{tag-name}'
        _controller: 'News::list'
        _arguments:
          tag-name: 'overwriteDemand/tags'
      - routePath: '/{tag-name}/page/{page}'
        _controller: 'News::list'
        _arguments:
          tag-name: 'overwriteDemand/tags'
          page: '@widget_0/currentPage'
          requirements:
            page: '\d+'
    defaultController: 'News::list'
    defaults:
      page: ''
    aspects:
      page:
        type: IntegerMapper
        start: 1
        end: 5000
      tag-name:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_tag
        routeFieldName: slug
Run Code Online (Sandbox Code Playgroud)

Oli*_*der 5

1) 多余的映射

  NewsTagPlugin:
    ...
    routes:
      ...
      - routePath: '/{tag-name}/page/{page}'
        _controller: 'News::list'
        _arguments:
          tag-name: 'overwriteDemand/tags'
          page: '@widget_0/currentPage'
          requirements:
            page: '\d+'
Run Code Online (Sandbox Code Playgroud)
  • _arguments 定义路由参数和内部变量的映射(例如作为查询参数)
  • requirements 这里是错误的,因为它不应用作参数映射
  • 参数requirements需要在根级别定义NewsTagPlugin

2) 无效的空默认值

  NewsTagPlugin:
    ...
    routes:
      ...
      - routePath: '/{tag-name}/page/{page}'
      ...
    defaults:
      page: ''
    aspects:
      ...
Run Code Online (Sandbox Code Playgroud)
  • defaults在 TYPO3 v9.5.14 之前未应用并在https://review.typo3.org/c/Packages/TYPO3.CMS/+/60361 中解决
  • 参数的空默认值page没有多大意义,并且会导致类似的 URL/some-tag/page/导致答案中显示的错误消息
  • 默认值应该是 page: 1
  • 如果在 URL 中应该省略参数(例如,具有/some-tag/page/),则需要{!page}在路由路径中使用显式定义

参考

调整后的增强器配置

  NewsTagPlugin:
    type: Extbase
    limitToPages: [14]
    extension: News
    plugin: Pi1
    routes:
      - routePath: '/{tag-name}'
        _controller: 'News::list'
        _arguments:
          tag-name: 'overwriteDemand/tags'
      - routePath: '/{tag-name}/page/{!page}'
        _controller: 'News::list'
        _arguments:
          tag-name: 'overwriteDemand/tags'
          page: '@widget_0/currentPage'
    defaultController: 'News::list'
    defaults:
      page: 1
    aspects:
      page:
        type: IntegerMapper
        start: 1
        end: 5000
      tag-name:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_tag
        routeFieldName: slug
Run Code Online (Sandbox Code Playgroud)
  • (未经测试)因为IntegerMapper似乎是一个自定义方面的实现 - 不向公众开放