Typo3 使用LazyObjectStorages持久化对象

Typo3 使用LazyObjectStorages持久化对象,typo3,extbase,Typo3,Extbase,我目前正在TYPO3 7/Extbase中实现一个web应用程序,它有一个由根对象和子对象树组成的复杂对象结构 假设它类似于更复杂的版本: 对象A对象B对象C 因为对象a的实例是聚合根,所以我使用对象a存储库来持久化树 这工作得很好,但出于性能原因,我将许多关系切换为延迟加载(使它们的对象存储变为延迟)。这大大加快了应用程序的运行速度,但并不是所有对Object-A-Repository的update()调用都能正常工作。当一个方法接收到一个C类型的对象,对其进行更改,并且需要持久化更改时,就会

我目前正在TYPO3 7/Extbase中实现一个web应用程序,它有一个由根对象和子对象树组成的复杂对象结构

假设它类似于更复杂的版本:

对象A对象B对象C

因为对象a的实例是聚合根,所以我使用对象a存储库来持久化树

这工作得很好,但出于性能原因,我将许多关系切换为延迟加载(使它们的对象存储变为延迟)。这大大加快了应用程序的运行速度,但并不是所有对Object-A-Repository的update()调用都能正常工作。当一个方法接收到一个C类型的对象,对其进行更改,并且需要持久化更改时,就会出现问题。C有一个指向其父B的父链接,B有一个指向a(惰性对象存储的对应项)的父链接

问题似乎与LazyObjectStorages没有用实际内容替换它们自己有关(因为在本例中,A对象没有使用它的关系“端”)。如果在更新对象之前对其调用DebuggerUtility::var_dump(),则持久性可以完美工作。如果我不这样做,数据库不会改变


有没有办法强制一个对象加载它所有的惰性存储?或者我应该用另一种方法来解决这个问题吗?

如果一个操作只改变了对象C,为什么不为该模型使用一个单独的存储库呢?您可以很容易地在extbase中提供存储库

在这种情况下,我看不到任何不好的做法或问题。默认情况下,typo3只会将关系数持久化到对象的数据库字段中,因此,如果添加或删除对象,则只需通过聚合根来持久化更改。使用ObjectC的子存储库,一个简单的更新就可以很好地工作

如果您真的需要通过聚合根目录执行此操作,那么应该确保不再有LazyObjectStorage

通过调用具体对象的一个函数,LazyObjectStorage将与真实的ObjectStorage交换其父属性(因此指针指向自身)

比如说

$objectA->getObjectsB()->current();
将$objectA中的属性objectsB设置为ObjectStorage(具有所有关系)


当然,像
$objectA->getObjectsB()->toArray()
这样的其他方法也会起作用。

为什么需要持久化惰性存储?它应该是定义没有更改,也不需要任何(新的)持久化。我有到A的父链接,但是A到B和B到C的存储似乎仍然很懒应该不再有懒惰对象,因为在access.Correct上会替换懒惰对象的实例。如果接收到类型为C的对象并对其进行更改,然后需要保留更改,则会出现问题。C有一个到B的链接,B有一个到a的链接(父链接),但是为了激活延迟存储替换,我必须回溯到我的C对象。我会相应地编辑这个问题。不是很干净,但是如果你需要独立地修改它,它可能更像是一个聚合的根,只需为C添加repository类,并单独保存这个类即可。关系由uid跟踪,因此不应该有任何问题。