Может ли объекты домена вызовите другие материалы данных? (Zend Framework)

StackOverflow https://stackoverflow.com/questions/4227463

Вопрос

Например:

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

Я хочу получить виджеты пользователя, управляемые указанным менеджером. Таким образом, я создал функцию в моем WidgetMapper, называемых FetchusersManageWidgets ($ useriD, $ Management), который запрашивает БД для этих 5 виджетов и отображает массив объектов виджета.

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

например

class Application_Model_User {

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

}

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

Это было полезно?

Решение

Узор в целом - это представление о том, как вы можете решить общую проблему. Их не является ни «придется делать это таким образом» или «все остальное плохое». На самом деле есть даже имя Для решения не следует за узорами умышленных узоров.
Из того, что я видел, люди, как правило, думают, что «один DB-таблица - это один домен, поэтому каждый DB-таблица нуждается в одной модели и один Mapper». В вашем случае я предполагаю, что у вас есть три таблицы: пользователи, виджеты и таблица удерживают отношение N: M между этими двумя (я назову его UserWidgets).
UserWidgets действительно является частью пользовательской модели и не имеет собственной модели / Mapper и является нет часть модели виджета. Чтобы разрешить эти идентификаторы виджетов в USERMODEL, нужен виджет Mapper, конечно, приводит к проблеме, которую вы описываете.
Вероятно, есть много способов разрешить это, я просто предполагаю, что Mapper по умолчанию, который перезаписывается:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top