3

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

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

4

2 回答 2

3

在 ExtBase 中,对象是“管理的”。这意味着每个持久性事务(添加/删除/更新)都只是在底层逻辑中记录下来,但直到适当的时间(如处理请求结束)才执行。因此,仅仅因为您将对象添加到存储库并不意味着它实际上已添加。这实际上发生在一次$persistenceManager->persistAll()被调用的情况下,这不是您需要手动执行的操作。关键是,您的$page对象在保存之前不会有 UID,这就是$page->getUid()返回 null 的原因。在这里寻找一个很好的解释。

我怀疑您正在尝试在 ExtBase 对象/MVC 生命周期之外做一些事情。至少,上次null我尝试获取对象的 UID 时,是因为我没有在框架内正确操作。

但是,如果您发布更多代码并向我们提供您想要实现的目标的更大图景,也许我们可以帮助您了解该对象实际上具有 UID。例如,如果您在 Controller 对象中,请告诉我们您在哪个 Action 方法中,或者如果您在 Repository 对象中,请告诉我们您要从存储库中获取什么以及您计划的位置/方式关于使用查询结果。

编辑

只是在这里猜测,但我假设您在控制器的某些操作中执行此代码。由于在执行控制器后会呈现视图,因此您只需将页面对象传递给视图:

$this->view->assign('page', $page);

然后在您的视图中,您可以在链接中使用页面对象:

<f:link.action action="show" arguments="{page:page}">
    See this page object
</f:link.action>

然后在控制器的显示操作中,您可以显示页面:

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 级别更容易。)

于 2012-05-09T23:17:03.850 回答
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();
于 2013-10-18T11:02:29.723 回答