TYPO3扩展访问现有数据表失败排查:无法读取指定表数据
嘿,我之前在TYPO3里跨扩展访问数据表时也踩过类似的坑,你创建了同名模型但拿不到数据,大概率是这几个环节没处理到位,一个个排查下:
模型与表的映射配置缺失
你在自己扩展里创建了模型,但TYPO3的Extbase并不知道这个模型对应哪个外部表。得在你扩展的ext_typoscript_setup.typoscript里手动指定映射关系:config.tx_extbase.persistence.classes { YourVendor\YourExtension\Domain\Model\Event { mapping { tableName = tx_institutsseminarverwaltung_domain_model_event } } }注意替换
YourVendor\YourExtension为你自己扩展的命名空间,保存后一定要清缓存!Repository类没配置或者注入错误
光有模型不够,还得对应一个Repository类来查询数据。在你的扩展里创建Classes/Domain/Repository/EventRepository.php,内容如下:<?php namespace YourVendor\YourExtension\Domain\Repository; use TYPO3\CMS\Extbase\Persistence\Repository; class EventRepository extends Repository {}然后在控制器里通过依赖注入获取这个Repository:
use YourVendor\YourExtension\Domain\Repository\EventRepository; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class YourController extends ActionController { protected EventRepository $eventRepository; public function injectEventRepository(EventRepository $eventRepository) { $this->eventRepository = $eventRepository; } public function listAction() { // 尝试获取所有记录 $events = $this->eventRepository->findAll(); $this->view->assign('events', $events); } }其实更省事的方法是直接用原扩展的Repository,只要你在自己的扩展里声明对原扩展的依赖(在
ext_emconf.php或composer.json里加依赖),然后直接注入原扩展的Repository就行,不用自己重复造模型和Repository。字段映射与权限问题
检查模型的属性和表字段是否完全对应:表字段是下划线命名的话,模型属性要转驼峰(比如表的start_date对应模型的$startDate),而且getter/setter方法要正确命名(getStartDate()、setStartDate())。另外,确保你的后台用户有访问这个数据表的权限,在List模块里能不能看到该表的记录?如果原扩展用了软删除(deleted字段)或隐藏(hidden字段),默认Extbase会过滤这些记录,要是想获取它们,得在Repository里调整查询设置:public function initializeObject() { $defaultQuerySettings = $this->createQuery()->getQuerySettings(); // 忽略enable字段(hidden, starttime等) $defaultQuerySettings->setIgnoreEnableFields(true); // 包含已删除的记录 $defaultQuerySettings->setIncludeDeleted(true); $this->setDefaultQuerySettings($defaultQuerySettings); }一定要清缓存!
TYPO3的缓存经常会搞事情,尤其是涉及到ORM映射和类加载的时候,每次改完配置或代码,都去后台Flush all caches,或者用命令行typo3 cache:flush彻底清一遍。
最后再确认下原扩展的表确实存在且有数据,用Database Analyzer检查下表结构有没有问题。
内容的提问来源于stack exchange,提问作者Felix

