【问题标题】:how to generate Frontend URI in Scheduler Command (TYPO3 9)如何在调度程序命令中生成前端 URI (TYPO3 9)
【发布时间】:2022-03-16 22:38:09
【问题描述】:

在 TYPO3 v9 的调度程序命令中生成前端 URI 的最佳方法是什么。

我见过手动初始化 TSFE 的尝试,但对我来说这似乎很可疑。 还有其他方法吗?

【问题讨论】:

    标签: typo3 typo3-9.x


    【解决方案1】:

    在任何上下文(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
    【解决方案2】:

    根据您的需要,@mathias-brodala 描述的本机方式可能还不够。在这些情况下,您将需要适当的 TSFE,否则您没有可能影响链接生成的所有 TypoScript 设置。

    对于这些情况,您基本上需要自己创建一个 TypoScriptFrontendController 的实例,调用 setup 方法并注入真实或模拟的依赖项,例如 FrontendUserAuthentication,具体取决于您的用例。

    例如,TYPO3v9 的有效解决方案可以在 rx_scheduled_social extension.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      相关资源
      最近更新 更多