2010-11-19 1 views
2

Я пытаюсь выяснить, как повторно использовать модели домена в разных частях приложения, и у меня возникает ощущение, что шаблон Data Mapper - это путь вперед. В приведенном ниже примере приведены методы, которые непосредственно получают доступ к методам Mapper.Объект домена, которому требуется больше одного Data 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; 
    } 
} 

... И сопоставление методов в классе групп.

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; 
    { 
} 

Теперь я знаю цель тощий Controller - Fat модели, так что у меня есть еще одна модель, чтобы отобразить Mapper (так сказать) к модели?

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

Модель данных не должна знакомиться с Data Mapper. Класс/модель группы не должен иметь методы поиска и не должен иметь доступ к картографу.

Как только вы удалите зависимость модели от вашей модели, ваши проблемы исчезнут.

ПРИМЕЧАНИЕ: проверить Doctrine 2

+0

Что делать, если «Группы» представляют собой коллекцию, содержащую объекты «Группа», и это сами модели, которые требуют зависимого сопоставления. Вам придется отделить их от групп, передать их через Mapper, а затем снова привязать их к коллекции? Значит ли это, что клиенту/Контролеру нужны знания о Mappers? – gawpertron

+0

Ваш 'FatModel' называется репозиторием. Здесь есть хорошее объяснение: http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca

+0

Зачем вам это нужно? Создайте его в соответствии с вашими потребностями. Я бы не использовал репо в качестве кеша. Поместите кеш на карту данных. – rojoca

0

Как rojoca говорит, что вы не должны иметь выборки/найти методы непосредственно на модели. Технически г-н также справедливо о том, что модель не хранит ссылку на картографа, но в менее сложных ситуациях я думаю, что это нормально, пока модель только выберет самую абстрактную форму картографа, которую вы планируете иметь (т. Е. Какой-то базовый кардпер класс или интерфейс).

Учитывая это, вам нужно только добавить методы в mapper, и для этого я бы просто использовал наследование, т.е. расширьте группу mapper для новой функциональности. Конечно, это требует, чтобы картограф был внедрен в модель. Но если вы собираетесь иметь модель, содержащую ссылку на ее картограф, тогда она обязательно должна быть инъекционной.

+0

По моим первым попыткам я добавил ссылку на картограф и понял на раннем этапе ограничения этого. Однако я не могу представить, как использовать mappers без модели или контроллера где-то, кто их знает? – gawpertron

+0

i dodnt думает, что с контроллерами что-то не так, с использованием карт напрямую, поскольку контроллеры являются специфичными для приложения/модуля. – prodigitalson

+0

Может ли Mapper знать другой Mapper? – gawpertron