TYPO3读取数据库单条记录时构造函数参数注入报错求助
解决TYPO3控制器构造函数注入ConnectionPool报错的方案
报错原因
当前控制器的构造函数依赖注入未被TYPO3的依赖注入容器正确处理,导致实例化时无法传入ConnectionPool对象。
具体解决方法
方法1:通过GeneralUtility手动获取(兼容所有TYPO3版本)
删除控制器中的构造函数,在initializeAction中初始化connectionPool:
private ConnectionPool $connectionPool; private const TABLE_NAME = 'tx_avvcard_domain_model_vcard'; protected function initializeAction() { $this->connectionPool = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(ConnectionPool::class); } // 移除原有的__construct方法
方法2:配置依赖注入(TYPO3 v10.4+ 推荐)
在扩展的Configuration/Services.yaml文件中添加控制器的依赖配置:
services: Averlon\AvVcard\Controller\VcardController: arguments: $connectionPool: '@TYPO3\CMS\Core\Database\ConnectionPool'
保存后清除TYPO3缓存,依赖注入容器会自动注入ConnectionPool实例。
方法3:使用属性注入注解(TYPO3 v11+)
删除构造函数,直接在属性上添加注入注解:
use TYPO3\CMS\Core\DependencyInjection\Attribute\Inject; #[Inject] private ConnectionPool $connectionPool; private const TABLE_NAME = 'tx_avvcard_domain_model_vcard'; // 移除原有的__construct方法
额外优化建议
- 代码中
iconAction的注释包含@param \Averlon\AvVcard\Domain\Model\Vcard $vcard,但方法签名无此参数,建议删除该注释避免混淆。 - 读取到记录后,可通过
$this->view->assign('vcardRecord', $xxRecord)将变量传递给Fluid模板,即可在模板中通过{vcardRecord}调用。
内容的提问来源于stack exchange,提问作者averlon
相关产品推荐
相关产品推荐

