где я могу разместить свой метод для добавления пользователей в группы?модель?картограф? - PullRequest
0 голосов
/ 23 сентября 2011

Мой вопрос в основном о дизайне ООП и ОРМ.Я создаю модели в Zend для пользователей и групп и использую мапперы для БД (а также использую внедрение зависимостей).У меня есть реляционная таблица user_groups для связи.Я пытаюсь найти лучший способ получить и настроить группы пользователей или пользователей группы.В настоящее время я рассматриваю 3 варианта, дайте мне знать, если я что-то забыл:

  1. Позаботьтесь о соединении таблиц БД в mapper, чтобы группы пользователей выглядели как часть модели User
  2. Добавление UserGroupsMapper: создание функций, таких как user-> addToGroup ($ group)
  3. Добавление UserGroupsMapper и Модель UserGroup: создание функций, таких как userGroup-> add ($ user, $ group)

Мысли о варианте 1:

Предполагается ли взаимно-однозначное соотношение между моделями и таблицами БД, или одна модель может представлять несколько таблиц?Если так, то когда это не будет хорошо?Другой пример: если у меня есть таблица color и таблица color_type (со строками типа «теплый» или «крутой»), содержит ли Color colorType в качестве переменной атрибута / экземпляра?Или он ссылается на ColorType как объект с помощью color_type_id, или у него есть реальный объект ColorType как ивар?


Мысли о варианте 2:

Для такой функции, как user-> addToGroup ($ group), будет ли она вызывать метод UserMapper, который затем вызывает метод в UserGroupsMapper, илибудет ли вызывать метод в UserGroupsMapper напрямую?Насколько я понимаю, картограф должен абстрагировать модель от данных, но что это означает в отношении отношений между моделями?Предполагается, что модели должны знать, как они связаны, или только мапперы?


Мысли о варианте 3:

Добавление модели UserGroup создает возможность доступа к этой модели в контроллере,Должен ли контроллер группы знать отношения модели, такие как объекты userGroup, или он должен только делать что-то вроде сказать группе добавить пользователя?


Надеюсь, вопрос достаточно ясен.Я знаю, что это довольно сложно, но я пока не смог найти хорошего ответа.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

(быстрый ответ)

Я мог бы сделать что-то вроде следующего:

$oMyGroup->addUser( $oMyUser );

Вы добавляете пользователя в группу независимо от того, какую стратегию вы бы использовали для сохранения / материализации объектов (datamapper, activerecord и т. Д.) В «хранилище» данных некоторого типа: база данных, сериализованные объекты в текстовом файле. , в памяти и т. д.

0 голосов
/ 23 сентября 2011

Обычно ваши модели - это просто простые объекты, которые представляют данные в таблице и позволяют вам получать и устанавливать значения. Картограф - это то место, где у вас был бы весь доступ к базе данных и логика. Обычно это отношения один к одному с вашими данными, но это не обязательно. Пока вы знаете, как управлять какими объектами.

Вы передадите модель в функцию отображения, и она получит оттуда информацию.

Так что я бы поместил вашу addUserToGroup в один из картографов, а не в саму модель.

Как правило, ваша модель должна иметь только геттеры и сеттеры, и, возможно, вспомогательную функцию или две для манипулирования данными в модели.

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

Кроме того, я расширяю свои модели из базового класса, что дает мне простой способ взять массив данных и установить свойства модели из массива. Также они содержат метод toArray, так что я могу легко превратить модель в массив, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...