routing - 带有自定义 ValueMapper 的 TYPO3 RouteEnhancer
问题描述
我目前正在尝试实现自定义 RouteEnhancer。
是我一个人,还是文档又严重不完整?除了更改日志条目中的一小段段落之外,我无法在 TYPO3 中找到有关自定义增强器的任何信息,我在哪里可以获得有关这些的更多信息?我无法在 API 文档中找到它们。
我的扩展中域模型的相关部分是Termin
和Veranstaltung
.
有一个n to 1
关系类型来自termin->veranstaltung
。我的Veranstaltung->showAction()
接受一个termin
作为参数。我从默认的 PersistedAliasMapper 开始,这uid
对于Termin
. 不幸的是,实际标题在Veranstaltung
实体中。
我想出了这些简单的转换器并将我的配置设置为使用它们。我有两个问题:
- 生成的 URL 仍然有一个 cHash
veranstaltung/81?cHash=fba7f1194090a8400556257a4cfe6f3b
,.
我该如何摆脱它? - 解析器似乎根本不起作用。我已经调试了返回值,它似乎没有任何问题。
resolve()
希望我将实体uid
作为字符串返回,对吗?
终端值映射器.php:
<?php
namespace REDACTED\REDACTEDVeranstaltungen\Routing\Aspect;
use TYPO3\CMS\Core\Routing\Aspect\PersistedMappableAspectInterface;
use TYPO3\CMS\Core\Site\SiteLanguageAwareTrait;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
class TerminValueMapper implements PersistedMappableAspectInterface
{
use SiteLanguageAwareTrait;
/**
* @param string $value
*
* @return string|null
*/
public function generate(string $value): ?string
{
if($uid=intval($value)){
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_REDACTEDveranstaltungen_domain_model_termin');
$statement = $queryBuilder
->select('t.uid', 'v.titel', 'v.urltitel', 't.beginn')
->from('tx_REDACTEDveranstaltungen_domain_model_termin','t')
->leftJoin('t', 'tx_REDACTEDveranstaltungen_domain_model_veranstaltung', 'v', 't.veranstaltung = v.uid')
->where(
$queryBuilder->expr()->eq('t.uid', $uid)//$queryBuilder->createNamedParameter('horst')
)
->execute();
if($record = $statement->fetch()){
if(is_array($record) && mb_strlen(trim($record['urltitel']))){
$beginn = new \DateTime();
$beginn->setTimestamp(intval($record['beginn']));
return $uid.'--'.str_replace('--', '-', $record['urltitel'].'-'.$beginn->format('d-m-Y') );
}
}
}
return $value;
}
/**
* @param string $value
*
* @return string|null
*/
public function resolve(string $value): ?string
{
return intval(explode('--',$value)[0]);
}
}
配置:
routeEnhancers:
REDACTEDveranstaltungen_veranstaltungen:
type: Extbase
extension: REDACTEDVeranstaltungen
plugin: Veranstaltungen
routes:
- { routePath: '/themenbereiche/{thema_titel}', _controller: 'Termin::search', _arguments: {'thema_titel': 'veranstaltungsarten/0'} }
- { routePath: '/veranstaltung/{termin_titel}', _controller: 'Veranstaltung::show', _arguments: {'termin_titel': 'termin'} }
aspects:
termin_titel:
#type: PersistedAliasMapper
#tableName: 'tx_REDACTEDveranstaltungen_domain_model_termin'
#routeFieldName: 'uid'
type: TerminValueMapper
thema_titel:
type: PersistedAliasMapper
tableName: 'sys_category'
routeFieldName: 'title'
解决方案
路由功能的文档 - 特别是扩展路由 - 可以在https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Routing/ExtendingRouting.html#writing-custom找到-增强剂
对于 cHash 的调试问题,请使用以下两个位置作为起点:
\TYPO3\CMS\Core\Routing\PageRouter::buildPageArguments
和Packages/TYPO3.CMS/typo3/sysext/core/Classes/Routing/PageRouter.php:311
扩展路由时,请注意是否需要编写自定义路由增强器(如果您需要操作完整路由的外观和解析方式)还是自定义方面(如果您想操作单个路由参数(“变量”)被映射并解决)。两者都有子类型(增强器和装饰器、静态或动态映射器),您可以在文档中找到它们。
推荐阅读
- google-cloud-platform - BigQuery 自动检测架构问题 int64 与 float64
- intellij-idea - IntelliJ 中是否还有其他用于 Java VM 系统属性的设置?
- c# - asp net core 返回具有空属性的json(非空)
- firebase - redirect_uri_mismatch - 没有更新 URL 的可能性
- android - 安卓。调整调整大小不适用于特定设备
- c# - c# MimeKit 邮件未正确发送。System.Net.Mail 工作正常
- kubernetes - Kubernetes 上的 Hyperledger Fabric - Restarting Peer throw 错误几分钟
- cordova - Cordova IOS/Android 屏幕显示,带有凹口和软菜单
- django - 关闭 RabbitMQ 会使 Django 冻结
- flutter - 如何在flutter web中做一个可拖动的定位销选择器