如何为TYPO3 9 LTS编写路由方面映射器

时间:2018-10-29 20:09:35

标签: typo3 extbase

我需要一个自定义方面映射器类,以定义可选的get参数的值。此参数包含一个带有额外数据的cf_cache标识符。但是此参数会产生一个我不需要的cHash参数,也不想在URL中看到。

文档(https://docs.typo3.org/typo3cms/extensions/core/Changelog/9.5/Feature-86365-RoutingEnhancersAndAspects.html)说:

  

如果要求过于宽松,则将URL签名参数(“ cHash”)添加到无法删除的URL的末尾。

还有:

  

如果您真的需要永远不要使用cHash参数,请确保所有占位符对页面段的结果(例如分页)都有严格的定义,并可以自由构建自定义映射器。

功能描述仅说明如何在ext_tables.php中注册自定义增强器类,而不说明如何使用自己的方面映射器:-(

很高兴,但是如何?

1 个答案:

答案 0 :(得分:0)

解决方案很简单,但是看来文档是错误的。根据文档,应该在ext_tables.php中使用$ GLOBALS ['TYPO3_CONF_VARS'] ['SYS'] ['routing'] ['CustomPlugin']注册一个Custom Enhancer。

更新

  

如果映射器已在ext_tables.php中注册,则仅当您登录TYPO3 BE时它才有效。映射器似乎必须在ext_localconf.php中注册。然后,它可以工作而无需登录BE

查看数组$ GLOBALS ['TYPO3_CONF_VARS'] ['SYS'] ['routing'],显示出Aspects和Enhancers的注册位置:

enter image description here

在ext_tables.php中注册映射器:

// Custom Routing Aspects Mapper
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['IdentifierValueMapper'] = \VENDOR\Extension\Routing\Aspect\IdentifierValueMapper::class;

aspects类:

<?php
namespace VENDOR\Extension\Routing\Aspect;

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

class IdentifierValueMapper implements StaticMappableAspectInterface
{
    use SiteLanguageAwareTrait;

    /**
     * {@inheritdoc}
     */
    public function generate(string $value): ?string
    {
        ...
        return $value !== false ? (string)$value : null;
    }

    /**
     * {@inheritdoc}
     */
    public function resolve(string $value): ?string
    {
        ...
        return isset($value) ? (string)$value : null;
    }

}

在没有自定义映射器的情况下,我的URL始终具有TYPO3 cHash属性(在我的情况下,绝对无用/非常丑陋)

  

/ page / 2 / price / asc / 03510890954e251e285104f156298e55952e4c7d?cHash = dd66994f041278f4c6bf2f7f64fb09e4

现在我得到的网址没有cHash:

  

/ page / 3 / price / asc / ae636e66563e72d3e4f592173f328fecbee5e44f