【问题标题】:TYPO3 8 LTS how to generate frontend page URL in CLI/Scheduler contextTYPO3 8 LTS 如何在 CLI/Scheduler 上下文中生成前端页面 URL
【发布时间】:2018-12-27 10:02:58
【问题描述】:

我试图弄清楚如何从 CLI/调度程序上下文生成绝对前端页面 URL。我创建了以下帮助类:


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 中可以正常工作,只要根行有域记录。

但是,同样的 sn-p 在 TYPO3 8 LTS 中不起作用,我需要它同时适用于 7 和 8。显然,我在 v8 的根行上设置了域记录,我清除了所有缓存等,但我无法获得绝对 URL。我只得到相对 URL。在这一点上,我对 realUrl 或类似的东西不太感兴趣。

对于 TYPO3 7,我基本上对它进行了逆向工程,但对于 TYPO3 8,它似乎有点复杂。你知道我可以做些什么来获取页面前端 URL 吗?

【问题讨论】:

    标签: url typo3 typo3-8.x


    【解决方案1】:

    问题似乎是GeneralUtility 的内部缓存,它为HTTP_HOSTHTTP_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 上都可以正常工作。

    【讨论】:

      【解决方案2】:

      https://wissen.netzhaut.de/typo3/extensionentwicklung/typolink-realurl-in-scheduler-tasks/

      但实际上:我建议对自定义页面使用 curl 调用,该页面将提供链接(有点像休息 API)——因为这样你几乎可以解决所有问题——除了没有 tsfe(例如安全路径\图像)。

      【讨论】:

      • 如何实现这个用于生成前端 URL 的 REST API?是否有现有的扩展?您需要扩展名还是可以通过打字稿来完成?
      • 为了获取页面 URL 而进行 curl 调用似乎有点极端,您不同意吗?在我看来,能够从各种上下文(不仅是前端)获取/创建页面/资源的 URL 是框架的一个完全正常的功能。尽管如此,进行 curl 调用还是相当慢,容易出错,而且听起来像是解决一些本应微不足道的事情的方法。我提供的解决方案也是一种解决方法,但至少没有前两个缺点。
      猜你喜欢
      • 2018-10-14
      • 2019-03-31
      • 2018-01-29
      • 1970-01-01
      • 2018-10-13
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      相关资源
      最近更新 更多