存储对象以供进一步使用

时间:2012-12-16 18:20:37

标签: zend-framework2

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

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

SO object1包含object2,object2包含object1。

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

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

1 个答案:

答案 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/