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