TYPO3中AJAX调用控制器时persistAll()不生效无法更新数据库问题
可能的原因及对应解决方案
实体属性校验拦截
AJAX请求传递的参数不满足Person实体定义的字段校验规则时,Extbase会静默标记实体为不可持久化,即使调用persistAll()也不会写入数据库。
解决方法:临时关闭对应参数的校验,在控制器方法上方添加注解@TYPO3\CMS\Extbase\Annotation\IgnoreValidation("person"),或者排查AJAX请求传递的所有字段是否符合实体的校验规则。实体未纳入当前持久化会话
如果代码里的$person实体不是通过personRepository->findByUid()等持久化查询方法获取的(比如手动new出来、或者从其他会话传递过来),Extbase无法识别该实体需要更新,即使调用repository的update方法也不会生效。
解决方法:先将实体合并到当前持久化会话,调整代码如下:
$persistenceManager = $this->objectManager->get("TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager"); // 先合并实体到当前会话 $person = $persistenceManager->merge($person); $person->setStatus(1); $this->personRepository->update($person); $persistenceManager->persistAll();
- 持久化上下文不一致
AJAX请求如果没有初始化完整的Extbase上下文,你手动获取的PersistenceManager实例可能和Repository内部使用的不是同一个,导致更新操作没有被同步到持久化管理器。
解决方法:优先使用依赖注入获取PersistenceManager,不要通过ObjectManager动态获取,在控制器中注入:
/** * @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager * @TYPO3\CMS\Extbase\Annotation\Inject */ protected $persistenceManager;
后续直接调用$this->persistenceManager->persistAll()即可。
- 字段持久化配置错误
检查Person实体的status字段是否标注了@TYPO3\CMS\Extbase\Annotation\ORM\Transient瞬态注解,标注了瞬态的字段不会被写入数据库。同时确认TCA配置中status字段的配置正确,没有被标记为exclude字段且当前请求上下文的用户有该字段的编辑权限。
内容的提问来源于stack exchange,提问作者lvollmer
相关产品推荐
相关产品推荐

