保存ExtBase模型后如何获取ID?

时间:2012-04-20 08:03:30

标签: extbase

创建模型并将其添加到存储库后,我希望将新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

什么时候得到它?我怎样才能在运行时检索?

2 个答案:

答案 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();