我有一些不好的问题。我会直截了当地了解细节
我使用映射器用来自数据库的数据来水合对象。当我需要数据时,将创建object1。 object1包含来自db的一些数据,它还包含一个object2,它由trigerring事件填充,然后由事件管理器管理。 object2在数据库中也有一些数据,所以我也在那里使用水合器。另外,object2包含object1,它的填充方式与object1的object2参数相同。
SO object1包含object2,object2包含object1。
当创建其中一个时,它将开始无限循环,因为当我创建object1并且它包含object2时,正在创建包含object1的object2,因此正在创建object1等等......
我的问题是:如何存储对象,所以我不会创建第二次相同的对象?所以我可以停止循环并一遍又一遍地创建相同的对象
答案 0 :(得分:0)
您不应该为此使用事件。我会重构一些更明智的例子:
1)Mapper只对它所映射的对象进行水合,它不会添加任何关系/子对象。
2)创建一个服务层,您的服务将使用映射器生成您需要的对象,并根据需要构建对象图。
示例:
SchoolService.php
public function getSchool($id)
{
$school = $schoolMapper->fetchSchool($id);
$students = $studentMapper->fetchStudentsFromSchool($school);
$school->addStudents($students);
return $school;
}
不再出现循环问题。
只允许数据映射器使用单个对象以保持简单。有时你可能只想要基本对象而不加载它的关系,因为你可能不需要它们,每次加载它们都需要额外的费用。只需根据需要加载它们。
您还可以考虑通过Vitrual Proxies实施LazyLoading。这是一种更有效地加载对象的好方法。
http://phpmaster.com/intro-to-virtual-proxies-1/ http://phpmaster.com/intro-to-virtual-proxies-2/