我目前正在TYPO3 7 / Extbase中实现一个Web应用程序,它具有一个复杂的对象结构,包括一个根对象和一个子对象树。
让我们说它类似于更复杂的版本:
对象A< - 1:n - >对象B< -1:n - >对象C
由于对象a的实例是聚合根,因此我使用Object-A-Repository来保存树。
这很好用,出于性能原因,我将许多关系转换为延迟加载(使其对象stoages懒惰)。这极大地加快了应用程序的速度,但并非所有对Object-A-Repository的update()调用都可以工作了。如果方法接收类型为C的对象,更改它并需要保留更改,则会出现此问题。 C有父链接到父B,而B有父链接到A(懒惰对象存储的对应物)。
问题似乎与LazyObjectStorages没有用实际内容替换它们有关(因为在这种情况下A对象没有使用它的关系“侧面”)。如果我在更新它之前在对象上调用DebuggerUtility :: var_dump(),则持久性可以完美地工作。如果不这样做,数据库就不会改变。
有没有办法强制对象加载它的所有懒惰存储?或者我应该以另一种方式解决这个问题?
答案 0 :(得分:0)
如果一个操作只改变了对象C,为什么不为该模型使用separat存储库呢?您可以非常轻松地在extbase中提供存储库。
在这种情况下,我没有看到任何不良做法或问题。默认情况下,typo3只会将对象的数量持久保存到objects_c的数据库字段中,因此,如果添加或删除对象,则只需通过聚合根持久保存更改。使用ObjectC的子存储库可以很好地完成一个简单的更新。
如果你真的需要通过聚合根来做,你应该确保不再有LazyObjectStorage。
通过调用具体对象的一个函数,LazyObjectStorage将使用真实的ObjectStorage交换其parent属性(所以指向自身的指针)。
例如
$objectA->getObjectsB()->current();
将$ objectA中的属性objectsB设置为ObjectStorage(包含所有关系)。
$objectA->getObjectsB()->toArray()
等其他方法当然也会起作用。