2010-11-19 59 views
2

我想弄清楚如何在应用程序的不同部分重用域模型,我有一种感觉,即数据映射器模式是前进的方向。下面的例子有直接访问Mapper方法的方法。需要多个数据映射器的域对象

class Groups 
{ 
    protected $_groups = array(); 

    public function addGroup($name) 
    { 
     $this->_groups[] = $name; 
    } 

    public function doSomethingGroupy($cakes) 
    { 
     // get all the groups that have cake 
     return $cakeyGroups; 
    } 
} 

...还有一个映射器,用于匹配Groups类中的方法。

class GroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Mappy type things, maybe some sql 
    } 

    public function fetchByNeediness($cuddles, Groups $group) 
    { 
     // More mappy type things 
    } 

    public function save(Groups $groups) 
    { 
     // Saves 
    } 
} 

不过,如果晚些时候我想用同族模型,但使用不同的查询填充组我会用不同的映射。

class AngryGroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Something similar but with other tables and joins 
    } 

    public function fetchByRage($anger, Groups $group) 
    { 
     // Something new but only needed here 
    } 

    public function isEditable(Groups $groups) 
    { 
     // Do some querying 
     return $bool; 
    { 
} 

现在我知道目标是瘦控制器 - 高脂模型,所以我还会有一个模型映射映射器(这么说)示范?

class FatModelRepository 
{ 
    public function getHappyGroups() 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->fetchByNeediness('Puffy Shoes', new Groups()); 
    } 

    public function getSadGroups() 
    { 
     $mapper = new AngryGroupMapper(); 
     return $mapper->fetchByRage('Aghh!', new Groups()); 
    { 

    public function save(Groups $groups) 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->save($groups); 
    { 
} 

回答

4

数据模型应该不知道数据映射器。你的组类/模型不应该有查找方法,它不应该有访问映射器。

一旦从模型中删除了映射器依赖项,您的问题就会消失。

注:退房Doctrine 2

+0

如果“组”是包含“组”对象的集合,那些模型本身需要依赖映射,该怎么办?你是否需要将它们从组中分离出来,通过Mapper传递给它们,然后将它们重新附加到集合中?这是否意味着客户/控制者需要Mappers的知识? – gawpertron 2010-11-19 20:20:31

+0

您的'FatModel'被称为存储库。这里有一个很好的解释:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca 2010-11-19 23:08:07

+0

你为什么?设计它以满足您的需求。我不会使用回购作为缓存。将缓存放在数据映射器上。 – rojoca 2010-11-21 05:59:23

0

由于rojoca说,你不应该有获取/直接找上了模型的方法。技术上他对模型没有存储对映射器的引用也是正确的,但在较不复杂的情况下,我认为这是可以的,只要模型只会激发你计划的最抽象的映射器形式(即某种基本映射器类或接口)。

考虑到事情,你应该只需要添加方法到映射器,为此我只会使用继承,即。扩展您的组映射器以获得新功能。当然,这需要映射器可注入到模型中。但是如果你打算让模型持有对其映射器的引用,那么它确实需要可注入。

+0

在我第一次尝试时,我添加了对映射器的引用,并很早就意识到了这样做的局限性。然而,我无法完全想象如何在没有模型或控制器的地方使用映射器来识别它们? – gawpertron 2010-11-19 20:48:02

+0

我不敢想你的控制器直接使用映射器有什么问题,因为控制器是特定于应用程序/模块的。 – prodigitalson 2010-11-19 22:44:54

+0

Mapper能否了解其他Mapper? – gawpertron 2010-11-30 19:51:57