创建模型并将其添加到存储库后,我想要具有不同用途的新ID(创建邮件,更新Extbase世界之外的其他字段)
$page = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Page');
$page->setTitle('Hello World');
$this->pageRepository->add($page);
此时,
$page
还没有ID,uid为null。$page->getUid(); // returns null
它什么时候得到的?以及如何在运行时检索?
最佳答案
在ExtBase中,对象是“托管”的。这意味着每个持久性事务(添加/删除/更新)都在底层逻辑中被简单记录,但直到适当的时间(例如处理请求结束)才执行。因此,仅因为将对象添加到存储库并不意味着它实际上已经添加。这实际上是在调用$persistenceManager->persistAll()
之后发生的,这永远不需要您手动进行。关键是,您的$page
对象在保存之前将没有UID,这就是$page->getUid()
返回null的原因。 Look here for a great explanation.
我怀疑您正在尝试在ExtBase对象/ MVC生命周期之外执行某些操作。至少,上一次我尝试获取对象的UID时得到了null
,这是因为我没有在框架内适当地操作。
但是,如果您发布了更多代码,并为我们提供了您想要实现的目标的全面介绍,也许我们可以帮助您达到该对象实际上具有UID的地步。例如,如果您在Controller对象中,请告诉我们您所使用的是哪个Action方法,或者如果您在Repository对象中,请告诉我们您要从存储库中获取什么以及计划的位置/方式有关使用查询结果的信息。
编辑
只是在这里猜测,但我假设您正在通过控制器的某些操作执行此代码。由于执行控制器后将呈现视图,因此您可以将页面对象传递给视图:
$this->view->assign('page', $page);
然后在您的视图中,可以在链接中使用页面对象:
<f:link.action action="show" arguments="{page:page}">
See this page object
</f:link.action>
然后在控制器的show action中可以显示页面:
public function showAction(Tx_MyExt_Domain_Model_Page $page) {
// Do whatever you need to show the page in the `Show.html` template
}
我真的只是在猜测。如果您可以向我们全面了解您要做什么,应该采取的行动方法以及类似的事情,我们可以更加自信地回答您的问题。
(我还假设您的页面对象不是常规TYPO3页面的替代品,并且它们是完全不同的东西。与php级别相比,通过后端接口处理这些TYPO3页面要容易得多。)
关于extbase - 保存ExtBase模型后如何获取ID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10242439/