TYPO3 8 LTS, как генерировать URL страницы внешнего интерфейса в контексте CLI / планировщика - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь выяснить, как генерировать абсолютные URL-адреса страниц веб-интерфейса из контекста CLI / планировщика.Я создал следующий вспомогательный класс:


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-адрес веб-страницы?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

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

Но на самом деле: я бы порекомендовал использовать вызов curl для пользовательской страницы, которая доставит ссылку (вроде как API отдыха) - потому что таким образом вы решаете почти все проблемы -и есть еще что-то, что не имеет tsfe (например, safePath \ images).

0 голосов
/ 27 декабря 2018

Кажется, что проблема заключалась во внутреннем кеше GeneralUtility, который кэшировал значение null для HTTP_HOST из $_SERVER superglobal.

Поэтому следующая строка из моего примера вышене имел эффекта

$_SERVER['HTTP_HOST'] = $domainData['domainName'] ?: '';

Чтобы заставить его работать в рамках CLI / Scheduler, мне пришлось очистить внутренний кэш GeneralUtility, вызвав


TYPO3\CMS\Core\Utility\GeneralUtility::flushInternalRuntimeCaches();

, прежде чем сделатьпозвоните по номеру $contentRenderer->typoLink_URL($command);

Теперь генерация внешнего интерфейса прекрасно работает как на TYPO3 7, так и на 8 LTS.

...