Могут ли доменные объекты вызывать другие преобразователи данных? (Zend Framework) - PullRequest
2 голосов
/ 19 ноября 2010

Например:

У меня есть пользователь с 10 виджетами.Наряду с этим у меня есть менеджер, который управляет 5 из этих виджетов.

Я хочу получить виджеты пользователя, управляемые указанным менеджером.Поэтому я создал функцию в моем WidgetMapper с именем fetchUsersManagedWidgets ($ userId, $ managerId), которая запрашивает базу данных для этих 5 виджетов и отображает массив объектов Widget.

Я знаю, что доменные объекты не должны знатьих сопоставители, но могу ли я создать функцию в модели User, которая вызывает функцию WidgetMapper?

например,

class Application_Model_User {

    public function getWidgetsManagedBy($manager) {
        $widgetMapper = new Application_Model_WidgetMapper;
        return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
    }

}

Или это улица с односторонним движением, и доменные объекты никогда не должнывызывать функции отображения?

1 Ответ

1 голос
/ 19 ноября 2010

Шаблон в целом - это представление о том, как можно решить общую проблему. Они не должны «делать это так» или «все остальное плохо». На самом деле есть даже имя для решения, которое не следует преднамеренно.
Из того, что я видел, люди склонны думать, что «одна таблица БД - это один домен, поэтому каждая таблица БД нуждается в одной модели и одном картографе». В вашем случае, я полагаю, у вас есть три таблицы: пользователи, виджеты и таблица, содержащая отношение n: m между этими двумя (я назову это userwidgets).
Пользовательские виджеты действительно являются частью пользовательской модели и не имеют собственной модели / сопоставителя и являются , а не частью модели виджета. Для разрешения этих идентификаторов виджетов в пользовательской модели, конечно же, нужен механизм отображения виджетов, что приводит к описанной вами проблеме.
Вероятно, есть много способов решить эту проблему, я просто предполагаю, что маппер по умолчанию перезаписывается:

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

В случае, если вы не хотите использовать средство отображения виджетов по умолчанию, вы просто должны установить его перед доступом к виджетам пользователя (они должны быть загружены по требованию).

...