域对象可以调用其他数据映射器? (Zend框架)
-
26-09-2019 - |
题
例如:
我有具有10只小部件的用户。沿着与我有管理这些窗口小部件的5管理器。
我想检索用户的窗口小部件由指定的经理管理。因此,我创建它询问分贝为那些5只小部件和映射窗口小部件的阵列的对象的功能在我WidgetMapper称为fetchUsersManagedWidgets($用户id,$经理ID)。
我知道域对象不应该是知道自己的地图制作的,但我可以在用户模型,调用WidgetMapper的函数创建一个函数?
e.g。
class Application_Model_User {
public function getWidgetsManagedBy($manager) {
$widgetMapper = new Application_Model_WidgetMapper;
return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
}
}
或者是这一个单行道,和域对象应该调用映射功能?
解决方案
一般
模式是你如何能解决的共同问题的想法。他们既不是“不得不这样做的”或“一切是坏”。事实上,甚至还有没有下面的模式故意名称的decission。结果 从我所看到的人倾向于认为“一个数据库表是一个域所以每一个DB-表需要一个模型和一个映射器”。在你的情况我想你有三个表:用户,widgets和表保持N:m之间的关系这两个(我称之为userwidgets)点击 该userwidgets是真正的用户模型的一部分,并没有自己的模型/映射,是的不可以窗口小部件模型的一部分。要解决在这些的usermodel部件编号可能需要过程的部件映射器导致的问题,您描述了。结果 可能有很多的方法来解决这个问题,我简单地假设一个默认映射器是重写的:
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;
}
}
如果你不想让访问用户的小部件(他们应该按需加载)之前,使用的默认控件映射器,你应该简单地把它。
不隶属于 StackOverflow