在 Symfony 命令中使用 Extbase 存储库

Azi*_*ich 1 typo3 extbase symfony-console typo3-10.x

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

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

plugin.tx_myext.persistence.storagePid = 15403
module.tx_myext.persistence.storagePid = 15403
Run Code Online (Sandbox Code Playgroud)

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

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

Azi*_*ich 5

经过更多研究后,我发现缺少一些引导程序,导致扩展设置(在我的例子中是 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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