【发布时间】:2022-03-16 22:38:09
【问题描述】:
在 TYPO3 v9 的调度程序命令中生成前端 URI 的最佳方法是什么。
我见过手动初始化 TSFE 的尝试,但对我来说这似乎很可疑。 还有其他方法吗?
【问题讨论】:
在 TYPO3 v9 的调度程序命令中生成前端 URI 的最佳方法是什么。
我见过手动初始化 TSFE 的尝试,但对我来说这似乎很可疑。 还有其他方法吗?
【问题讨论】:
在任何上下文(FE/BE/CLI)中创建链接的正确方法是使用PageRouter。此路由器始终连接到site,因此您需要先检索正确的站点,例如通过使用SiteFinder。之后你可以使用PageRouter::generateUri()。
完整示例:
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Utility\GeneralUtility;
$site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId($pageUid);
$arguments = [
'foo' => 1,
];
// E.g.: "https://example.org/slug-of-page/?foo=1"
$uri = (string)$site->getRouter()->generateUri((string)$pageUid, $arguments);
请注意,此 API 对 Extbase 一无所知,并通过 $arguments 传递到 URI,因此如果您需要模仿 Extbase UriBuilder 的行为,您需要自己做:
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Service\ExtensionService;
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$extensionService = $objectManager->get(ExtensionService::class);
// E.g. "tx_acme_test"
$argumentsPrefix = $extensionService->getPluginNamespace($extensionName, $pluginName);
$arguments = [
$argumentsPrefix => [
'action' => $actionName, // E.g. "bar"
'controller' => $controllerName, // E.g. "Foo"
'foo' => 42,
],
];
// E.g.: "https://example.org/slug-of-page/?tx_acme_test[action]=bar&tx_acme_test[controller]=Foo&tx_acme_test[foo]=42"
// Or with a route enhancer: "https://example.org/slug-of-page/detail/slug-of-foo"
$uri = (string)$site->getRouter()->generateUri((string)$pageUid, $arguments);
【讨论】:
TYPO3_CONTEXT 以获得正确的域。这可以通过像这样调用 CLI 来完成:TYPO3_CONTEXT=Development php typo3/sysext/core/bin/typo3 myext:myclass。另一种方法是在.profile 或.bashrc 中设置您的主目录(Linux 或Mac)的上下文。在此处添加一行export TYPO3_CONTEXT=Development。
根据您的需要,@mathias-brodala 描述的本机方式可能还不够。在这些情况下,您将需要适当的 TSFE,否则您没有可能影响链接生成的所有 TypoScript 设置。
对于这些情况,您基本上需要自己创建一个 TypoScriptFrontendController 的实例,调用 setup 方法并注入真实或模拟的依赖项,例如 FrontendUserAuthentication,具体取决于您的用例。
例如,TYPO3v9 的有效解决方案可以在 rx_scheduled_social extension.
【讨论】: