查询生成器手册中的描述实例化不起作用。
我的代码是 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() 手动实例化和初始化查询构建器,否则您将错过必要的依赖项和运行时设置。
有什么想法吗?是手册错误还是我的代码有错误?
谢谢!
通常,您可以使用自定义构造函数参数覆盖
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
)。