创建模型并将其添加到存储库后,我希望将新ID用于不同目的(创建邮件,更新Extbase世界之外的其他字段)
$page = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Page');
$page->setTitle('Hello World');
$this->pageRepository->add($page);
此时$page
还没有ID,uid为空。
$page->getUid(); // returns null
什么时候得到它?我怎样才能在运行时检索?
答案 0 :(得分:3)
在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动作中,您可以显示页面:
public function showAction(Tx_MyExt_Domain_Model_Page $page) {
// Do whatever you need to show the page in the `Show.html` template
}
我真的只是在这里猜测。如果你能给我们一个更大的图片,说明你想要做什么,你的行动方法应该做什么以及类似的事情,我们可以更自信地回答你的问题。
(我还假设您的页面对象不是常规TYPO3页面的替代品,并且它们是完全不同的。通过后端界面处理这些TYPO3页面要比在php级别。)
答案 1 :(得分:1)
您可以在控制器中显式调用持久性管理器,如下所示
#TYPO3 4.x
$persistenceManager = $this->objectManager->create('Tx_Extbase_Persistence_Manager');
$persistenceManager->persistAll();
#TYPO3 6.x
$persistenceManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager');
$persistenceManager->persistAll();