扩展中连接池实例化的问题

问题描述 投票:0回答:1

查询生成器手册中的描述实例化不起作用。

我的代码是 symfony 命令的一部分:

namespace MyVendor\MyExtension\Command;
use TYPO3\CMS\Core\Database\ConnectionPool;

class myClassCommand extends Command {
    public function __construct(
        private readonly ConnectionPool $connectionPool
    ) {}
}

这会导致以下错误:

未捕获的 TYPO3 异常 函数 myClassCommand::__construct() 的参数太少,在第 3000 行 /var/www/html/site/vendor/typo3/cms-core/Classes/Utility/GeneralUtility.php 中传递了 0 个参数,并且预期为 1 个参数.

原因可能是类命令有一个自己的 __construct 方法,该方法需要一个参数。

在 TYPO3 的早期版本中,我使用了这种结构:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($myTable);

效果很好。但根据版本12的手册,不建议再使用GeneralUtility:

切勿使用依赖项注入或 GeneralUtility::makeInstance() 手动实例化和初始化查询构建器,否则您将错过必要的依赖项和运行时设置。

有什么想法吗?是手册错误还是我的代码有错误?

谢谢!

typo3
1个回答
0
投票

通常,您可以使用自定义构造函数参数覆盖

Symfony\Component\Console\Command\Command
的默认构造函数,而不保留原始构造函数参数。请参阅
TYPO3\CMS\Backend\Command\CreateBackendUserCommand
作为示例,该示例也使用
ConnectionPool
作为 DI 构造函数参数。

根据错误信息,很可能是自动加载出现问题。请确保始终清除 TYPO3 缓存并转储自动加载文件(在安装工具中或使用 Composer 进行基于 Composer 的安装)。

我认为您误解了手册中关于

GeneralUtility::makeInstance()
的内容。文档正确指出,不得使用 DI 或
QueryBuilder
手动实例化
GeneralUtility::makeInstance()
。但这并不意味着您不能使用 DI 或
GeneralUtility::makeInstance()
来实例化其他类(例如
ConnectionPool
)。

© www.soinside.com 2019 - 2024. All rights reserved.