Доменный объект, которому требуется более одного Data Mapper - PullRequest
2 голосов
/ 19 ноября 2010

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

Теперь я знаю, что целью является Skinny Controller - Fat Model, поэтому у меня была бы другая модель для сопоставления 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);
    {
}

Ответы [ 2 ]

4 голосов
/ 19 ноября 2010

Модель данных не должна знать о Data Mapper. У вашего класса / модели Groups не должно быть методов find и не должно быть доступа к мапперу.

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

ПРИМЕЧАНИЕ: проверить Доктрина 2

0 голосов
/ 19 ноября 2010

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

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

...