TYPO3 路由:多路径段

TYPO3 Routing: Multiple Path Segments

我正在尝试为某些类别生成树 URL。 URL 应如下所示:/category1/subcategory1/subcategory2。 路径段的数量应该是灵活的,因为我不知道类别有多深。

我得到了使用以下配置和 自定义映射器的第一个路径段:

ProductsPlugin:
  type:              Extbase
  limitToPages:
    - 5
  extension:         MyExt
  plugin:            Products
  routes:
    -
      routePath:   '/{category_title}'
      _controller: 'Products::list'
      _arguments:
        category_title: id
  defaultController: 'Products::list'
  requirements:
    category_title: '[0-9]{1..6}'
  aspects:
    category_title:
      type: ProductsValueMapper

映射器看起来像这样:

<?php

namespace Vendor\MyExt\Routing\Aspect;

use TYPO3\CMS\Core\Routing\Aspect\PersistedMappableAspectInterface;
use TYPO3\CMS\Core\Site\SiteLanguageAwareTrait;

class ProductsValueMapper implements PersistedMappableAspectInterface
{
    use SiteLanguageAwareTrait;

    /**
     * @param string $value
     *
     * @return string|null
     */
    public function generate(string $value): ?string
    {
        /**
         * returns one or more path segments
         * e.g. category1 or category1/subcategory1
         */
        return $slug; 
    }

    /**
     * @param string $value
     *
     * @return string|null
     */
    public function resolve(string $value): ?string
    {
        /**
         * returns the id of the category from the last path segment
         */
        return $id;
    }
}

对于单个类别,它工作正常。但是一旦请求子类别,代码就会中断。子类的link只包含子类的路径段,例如/subcategory1,但不是类别之一。

我很清楚为什么会这样,因为我只将子类别的 ID 添加到 LinkViewHelper:<f:link.action controller="Products" action="list" arguments="{id: 5}">Test Link</f:link.action>。但是我可以

我需要调整哪些螺丝才能使 URL 也适用于任何深度的子类别?

提前致谢!

您必须允许 / 作为要求。默认要求是 [^/]+,您只指定了一个数字。

这应该有效:

ProductsPlugin:
  requirements:
    category_title: .+

另见 Symfony 文档:https://symfony.com/doc/4.1/routing/slash_in_parameter.html