域对象可以调用其他数据映射器吗? (Zend框架)
例如:
我有一个拥有10个Widget的用户。 除此之外,我还有一位经理负责管理其中的5个小部件。
我想检索由指定管理器管理的用户Widgets。 所以我在我的WidgetMapper中创建了一个名为fetchUsersManagedWidgets($ userId,$ managerId)的函数,它为这5个小部件查询数据库并映射Widget对象数组。
我知道域对象不应该知道他们的映射器,但我可以在用户模型中创建一个调用WidgetMapper函数的函数?
例如
class Application_Model_User {
public function getWidgetsManagedBy($manager) {
$widgetMapper = new Application_Model_WidgetMapper;
return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
}
}
或者这是单向街道,域对象不应该调用映射函数?
一般来说,模式就是你如何解决一个共同问题的想法。 他们既不是“必须这样做”,也不是“其他一切都不好”。 事实上,甚至有一个名称不符合故意模式。
根据我所看到的,人们倾向于认为“一个db表是一个域,所以每个db表需要一个模型和一个映射器”。 在你的情况下,我想你有三个表:用户,小工具和持有这两者之间的n:m关系的表(我将它称为userwidgets)。
userwidgets实际上是用户模型的一部分,没有自己的模型/映射器, 也不是widget模型的一部分。 要解决用户模型中的这些小部件ID,确实需要小部件映射器,这会导致您描述的问题。
有很多方法可以解决这个问题,我简单地假设一个可覆写的default-mapper:
Class UserModel
{
$_widgetMapper = null;
public function getWidgetMapper()
{
if(null === $this->_widgetMapper)
{
$this->setWidgetMapper(new DefaultWidgetMapper());
}
return $this->_widgetMapper();
}
public function setWidgetMapper($mapper)
{
// todo: make sure it's a mapper of the correct type
$this->_widgetMapper = $mapper;
}
}
如果你不想使用默认的widget-mapper,你应该在访问用户的小部件之前进行设置(它们应该按需加载)。
链接地址: http://www.djcxy.com/p/56227.html上一篇: Can domain objects call other data mappers? (Zend Framework)
下一篇: Is this the common structure for the domain mapper model?