Zend framework2 存储对象以供进一步使用

Zend framework2 存储对象以供进一步使用,zend-framework2,Zend Framework2,我有一些不好的问题。我会详细谈谈 Im使用映射器将对象与数据库中的数据混合。当我需要数据时,将创建object1。object1包含来自db的一些数据,它还包含一个object2,该object2由trigerring事件填充,然后由事件管理器管理。object2在数据库中也有一些数据,所以我也在使用Hyderator。此外,object2包含object1,其填充方式与object1的object2参数相同 因此object1包含object2,object2包含object1 当要创建其中一

我有一些不好的问题。我会详细谈谈

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

因此object1包含object2,object2包含object1

当要创建其中一个对象时,它将开始无休止的循环,因为当我创建object1并且它包含object2时,object2正在被创建,而object2包含object1,所以object1正在被创建,以此类推


我的问题是:如何存储对象,使我不会第二次创建同一对象?因此,我可以停止该循环,一遍又一遍地创建相同的对象。您不应该为此使用事件。我会重构到更合理的东西,例如:

1) 映射器仅映射其映射的对象,不添加任何关系ships/子对象

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

例如:

SchoolService.php

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

     return $school;
}
不再有循环问题了

只让您的datamapper处理单个对象以保持简单。有时您可能只希望加载基本对象,而不希望加载它的关系,因为您可能不需要它们,而且每次加载它们都会增加额外的成本。只需根据需要加载即可

您还可以考虑通过Vitrual代理实现懒散加载。这是一种更有效地加载对象的好方法


首先,你应该考虑重构它,这听起来像设计缺陷。可能你有一些相关的,但独立的功能,可以提取。在您的情况下,您可能可以将您的对象设置为事件对象,然后尝试在侦听器中使用它。您能提供一些您所想的代码示例吗?因为我不认为这听起来像是依赖注入问题。如果您创建了几个工厂并使用zf2服务管理器,您应该能够毫不费力地处理循环依赖性问题。如果您没有使用过service manager,并且正在使用zf2,那么您确实需要了解它: