在 Symfony 命令中使用 Extbase 存储库

Use of Extbase Repositories in Symfony Command

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

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

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

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

我是不是做错了什么,或者无法在 symfony 命令中使用 extbase 存储库 classes?

经过更多研究后,我发现缺少一些引导程序,导致扩展设置(在我的例子中是 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 化合物(如存储库)将从那里开始使用这些设置。可爱

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