TYPO3 8 LTS 如何在 CLI/Scheduler 上下文中生成前端页面 URL
TYPO3 8 LTS how to generate frontend page URL in CLI/Scheduler context
我正在尝试找出如何从 CLI/Scheduler 上下文生成绝对前端页面 URLs。我创建了以下助手 class:
class FrontendUrlProvider
{
/**
* @var ObjectManagerInterface
*/
private $objectManager;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @param ObjectManagerInterface $objectManager
* @param LoggerInterface $logger
*/
public function __construct(ObjectManagerInterface $objectManager, LoggerInterface $logger)
{
$this->objectManager = $objectManager;
$this->initializeTimeTracker();
$this->logger = $logger;
}
/**
* @param int $pageId
* @param int $languageId
* @return Uri
*/
public function pageUrl($pageId, $languageId)
{
$url = '';
$this->logger->error('generating preview link');
try {
$this->initializeTypoScriptFrontend($pageId);
$this->setUpPageDomainIfCliContext($pageId);
$contentRenderer = $this->objectManager->get(ContentObjectRenderer::class);
$command = $this->linkCommand($pageId, $languageId);
$url = $contentRenderer->typoLink_URL($command);
$this->logger->error("preview link is: $url");
} catch (\Exception $exception) {
$this->logger->error($exception->getMessage());
$this->logger->error($exception->getTraceAsString());
}
return new Uri($url);
}
private function initializeTimeTracker()
{
if (!is_object($GLOBALS['TT'])) {
$GLOBALS['TT'] = new \TYPO3\CMS\Core\TimeTracker\NullTimeTracker();
}
}
/**
* @param int $pageId
*/
private function initializeTypoScriptFrontend($pageId)
{
if (isset($GLOBALS['TSFE']) && is_object($GLOBALS['TFSE'])) {
return;
}
$GLOBALS['TSFE'] = $this->objectManager->get(TypoScriptFrontendController::class, $GLOBALS['TYPO3_CONF_VARS'], $pageId, '');
$GLOBALS['TSFE']->sys_page = $this->objectManager->get(PageRepository::class);
$GLOBALS['TSFE']->sys_page->init(false);
$GLOBALS['TSFE']->tmpl = $this->objectManager->get(TemplateService::class);
$GLOBALS['TSFE']->tmpl->init();
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->determineId();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->getConfigArray();
}
/**
* @param int $pageId
*/
private function setUpPageDomainIfCliContext($pageId)
{
if (!isset($_SERVER['HTTP_HOST']) || !$_SERVER['HTTP_HOST']) {
$domainData = $GLOBALS['TSFE']->getDomainDataForPid($pageId);
if (is_array($domainData) && isset($domainData['domainName']) && !empty($domainData['domainName'])) {
$_SERVER['HTTP_HOST'] = $domainData['domainName'] ?: '';
}
}
}
/**
* @param int $pageId
* @param int $languageId
* @return array
*/
private function linkCommand($pageId, $languageId)
{
$languageQuery = http_build_query(['L' => $languageId], null, '&', PHP_QUERY_RFC3986);
return array(
'parameter' => $pageId,
'useCacheHash' => false,
'forceAbsoluteUrl' => true,
'linkAccessRestrictedPages' => true,
'additionalParams' => '&' . $languageQuery,
);
}
}
我认为它在 TYPO3 7 LTS 中工作正常,只要有根行的域记录。
但是,同样的代码片段在 TYPO3 8 LTS 中不起作用,我需要它同时适用于 7 和 8。显然,我已经在 v8 的根行设置了域记录,我清除了所有缓存等,但我无法获得绝对的 URL。我只得到亲戚URL。在这一点上,我对 realUrl 或类似的东西不感兴趣。
对于TYPO3 7,我基本上是逆向工程的,但是对于TYPO3 8,它似乎有点复杂。你知道我还能做些什么来获得页面前端吗URL?
问题似乎是 GeneralUtility
的内部缓存,它为 $_SERVER
超全局的 HTTP_HOST
缓存了一个 null
值。
因此,我上面示例中的以下行没有效果
$_SERVER['HTTP_HOST'] = $domainData['domainName'] ?: '';
为了使其在 CLI/Scheduler 范围内工作,我必须通过调用
清除 GeneralUtility
的内部缓存
TYPO3\CMS\Core\Utility\GeneralUtility::flushInternalRuntimeCaches();
在致电 $contentRenderer->typoLink_URL($command);
之前
现在前端 URL 生成在 TYPO3 7 和 8 LTS 上都可以正常工作。
https://wissen.netzhaut.de/typo3/extensionentwicklung/typolink-realurl-in-scheduler-tasks/
但实际上:我建议对自定义页面使用 curl 调用,它将提供 link(有点像休息 API)- 因为这样你就可以解决几乎所有问题- 除了没有 tsfe 之外还有更多(例如 safePath \ images)。
我正在尝试找出如何从 CLI/Scheduler 上下文生成绝对前端页面 URLs。我创建了以下助手 class:
class FrontendUrlProvider
{
/**
* @var ObjectManagerInterface
*/
private $objectManager;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @param ObjectManagerInterface $objectManager
* @param LoggerInterface $logger
*/
public function __construct(ObjectManagerInterface $objectManager, LoggerInterface $logger)
{
$this->objectManager = $objectManager;
$this->initializeTimeTracker();
$this->logger = $logger;
}
/**
* @param int $pageId
* @param int $languageId
* @return Uri
*/
public function pageUrl($pageId, $languageId)
{
$url = '';
$this->logger->error('generating preview link');
try {
$this->initializeTypoScriptFrontend($pageId);
$this->setUpPageDomainIfCliContext($pageId);
$contentRenderer = $this->objectManager->get(ContentObjectRenderer::class);
$command = $this->linkCommand($pageId, $languageId);
$url = $contentRenderer->typoLink_URL($command);
$this->logger->error("preview link is: $url");
} catch (\Exception $exception) {
$this->logger->error($exception->getMessage());
$this->logger->error($exception->getTraceAsString());
}
return new Uri($url);
}
private function initializeTimeTracker()
{
if (!is_object($GLOBALS['TT'])) {
$GLOBALS['TT'] = new \TYPO3\CMS\Core\TimeTracker\NullTimeTracker();
}
}
/**
* @param int $pageId
*/
private function initializeTypoScriptFrontend($pageId)
{
if (isset($GLOBALS['TSFE']) && is_object($GLOBALS['TFSE'])) {
return;
}
$GLOBALS['TSFE'] = $this->objectManager->get(TypoScriptFrontendController::class, $GLOBALS['TYPO3_CONF_VARS'], $pageId, '');
$GLOBALS['TSFE']->sys_page = $this->objectManager->get(PageRepository::class);
$GLOBALS['TSFE']->sys_page->init(false);
$GLOBALS['TSFE']->tmpl = $this->objectManager->get(TemplateService::class);
$GLOBALS['TSFE']->tmpl->init();
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->determineId();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->getConfigArray();
}
/**
* @param int $pageId
*/
private function setUpPageDomainIfCliContext($pageId)
{
if (!isset($_SERVER['HTTP_HOST']) || !$_SERVER['HTTP_HOST']) {
$domainData = $GLOBALS['TSFE']->getDomainDataForPid($pageId);
if (is_array($domainData) && isset($domainData['domainName']) && !empty($domainData['domainName'])) {
$_SERVER['HTTP_HOST'] = $domainData['domainName'] ?: '';
}
}
}
/**
* @param int $pageId
* @param int $languageId
* @return array
*/
private function linkCommand($pageId, $languageId)
{
$languageQuery = http_build_query(['L' => $languageId], null, '&', PHP_QUERY_RFC3986);
return array(
'parameter' => $pageId,
'useCacheHash' => false,
'forceAbsoluteUrl' => true,
'linkAccessRestrictedPages' => true,
'additionalParams' => '&' . $languageQuery,
);
}
}
我认为它在 TYPO3 7 LTS 中工作正常,只要有根行的域记录。
但是,同样的代码片段在 TYPO3 8 LTS 中不起作用,我需要它同时适用于 7 和 8。显然,我已经在 v8 的根行设置了域记录,我清除了所有缓存等,但我无法获得绝对的 URL。我只得到亲戚URL。在这一点上,我对 realUrl 或类似的东西不感兴趣。
对于TYPO3 7,我基本上是逆向工程的,但是对于TYPO3 8,它似乎有点复杂。你知道我还能做些什么来获得页面前端吗URL?
问题似乎是 GeneralUtility
的内部缓存,它为 $_SERVER
超全局的 HTTP_HOST
缓存了一个 null
值。
因此,我上面示例中的以下行没有效果
$_SERVER['HTTP_HOST'] = $domainData['domainName'] ?: '';
为了使其在 CLI/Scheduler 范围内工作,我必须通过调用
清除GeneralUtility
的内部缓存
TYPO3\CMS\Core\Utility\GeneralUtility::flushInternalRuntimeCaches();
在致电 $contentRenderer->typoLink_URL($command);
现在前端 URL 生成在 TYPO3 7 和 8 LTS 上都可以正常工作。
https://wissen.netzhaut.de/typo3/extensionentwicklung/typolink-realurl-in-scheduler-tasks/
但实际上:我建议对自定义页面使用 curl 调用,它将提供 link(有点像休息 API)- 因为这样你就可以解决几乎所有问题- 除了没有 tsfe 之外还有更多(例如 safePath \ images)。