0

我有一些不好的问题。我会直截了当地讲细节

我使用映射器使用数据库中的数据来水合对象。当我需要数据时,将创建 object1。object1 包含来自 db 的一些数据,它还包含一个 object2,它由触发事件填充,然后由事件管理器管理。object2 在数据库中也有一些数据,所以我也在那里使用 hydrator。此外,object2 包含 object1,它的填充方式与 object1 的 object2 参数相同。

SO object1 包含 object2,而 object2 包含 object1。

当涉及到创建其中一个时,它将开始无限循环,因为当我创建 object1 并且它包含 object2 时,正在创建 object2 包含 object1 所以正在创建 object1 等等......

我的问题是:如何存储对象,这样我就不会第二次创建同一个对象?所以我可以停止那个循环并一遍又一遍地创建相同的对象

4

1 回答 1

0

您不应该为此使用事件。我会重构一些更明智的东西,例如:

1)您的 Mapper 仅水合它正在映射的对象,它不添加任何关系/子对象。

2)创建一个服务层,你的服务将使用映射器来生成你需要的对象,并根据需要构建你的对象图。

例子:

学校服务.php

public function getSchool($id)
{
     $school = $schoolMapper->fetchSchool($id);
     $students = $studentMapper->fetchStudentsFromSchool($school);
     $school->addStudents($students);

     return $school;
}

不再有循环问题。

只让您的数据映射器处理单个对象以保持简单。有时您可能只想要基本对象而不加载它的关系,因为您可能不需要它们,并且每次加载它们都会产生额外的成本。只需根据需要加载它们。

您还可以考虑通过虚拟代理实现 LazyLoading。这是更有效地加载对象的好方法。

http://phpmaster.com/intro-to-virtual-proxies-1/ http://phpmaster.com/intro-to-virtual-proxies-2/

于 2013-02-14T09:48:15.540 回答