TYPO3路由:多个路径段

时间:2019-02-05 08:19:21

标签: typo3 typo3-9.x

我正在尝试为某些类别生成树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;
    }
}

仅对单个类别有效。但是,一旦请求了子类别,代码就会中断。到子类别的链接仅包含子类别的路径段,例如/subcategory1,但不是该类别之一。

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

这应该有效:

ProductsPlugin:
  requirements:
    category_title: .+

另请参见Symfony-Docs:https://symfony.com/doc/4.1/routing/slash_in_parameter.html