首页 > 解决方案 > 在 Symfony 命令中使用 Extbase 存储库

问题描述

我正在升级一个扩展以使用 TYPO3 v10。由于命令控制器不能再使用,我将它们迁移到文档中指出的 symfony 命令。除了使用 extbase 存储库类之外,一切都非常顺利。无论我查询什么,我都没有得到结果。由于我在网络和文档上找不到任何有用的信息,我希望这可能只是一些小问题。

经过一段时间的调试后,我发现在构建查询设置时没有正确确定 pid。我觉得这种奇怪,因为我的根模板有以下几行:

plugin.tx_myext.persistence.storagePid = 15403
module.tx_myext.persistence.storagePid = 15403

存储库实例由 injectMyRepository() 方法正确注入。我尝试使用 extbase ObjectManager 来获取类实例,但“错误”保持不变。

我做错了什么还是不能在 symfony 命令中使用 extbase 存储库类?

标签: typo3extbasesymfony-consoletypo3-10.x

解决方案


经过更多研究后,我发现缺少一些引导程序,导致扩展设置(在我的情况下为 storageID)未加载。从我一直在阅读的内容来看,我猜这种行为似乎是为了防止 extbase 启动?

官方文档中有类似内容的引用:https ://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/CommandControllers/Index.html#initialize-backend-user 知道那,我试图找到一种方法来初始化我找不到的缺失设置。所以这确实看起来像是一个缺失的功能。

我开发了一个我不太引以为豪的解决方法,但总比没有好(或就此将一切重建为教义)。如果你偶然发现了同样的问题,那就去吧。只需在触发查询之前插入并调用此方法:

public static function initializeConfigurationManager(): void
{
    /** @var ConfigurationManager $configurationManager */
    $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
    $tmpConfiguration = $configurationManager->getConfiguration(
        ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK,
        'myExtensionName'
    );

    $configurationManager->setConfiguration($tmpConfiguration);
}

该方法利用了 ConfigurationManager 的单例状态。您只需手动注入扩展的静态模板,然后每个 extbase 化合物(如存储库)将从那里使用这些设置。迷人的。

但是请注意,这很容易随着未来的内部变化而中断。


推荐阅读