В чем разница между прокси, репозиториями и сервисами в Doctrine 2? - PullRequest
7 голосов
/ 06 марта 2011

Мне интересно, в чем разница между этими тремя шаблонами.

Насколько я понимаю:

  • Прокси используются только для объектов с отложенной загрузкой
  • Репозитории используются для добавления логики в вашу модель (ширина некоторого ярлыка для оператора DQL)
  • Службы используются для использования моделей и контроллеров

Для этого, службы, я полагаюДело в том, что проект Doctrine 2 в качестве хранилища не знает о постоянной системе, потому что он использует ORM с DBAL.

Я читал, что прокси-серверы можно использовать для добавления логики в сущности, поэтомуВ чем разница с репозиториями?

Кстати, мои сущности должны содержать только открытый метод получения / установки для своего атрибута и только это?Это правильно?

Я немного растерялся.

У вас есть конкретный пример?

1 Ответ

17 голосов
/ 11 марта 2011

Прокси-сервер - это ссылка на что-то.

Предположим, вы создаете пользователя, и у одного пользователя есть одна присоединенная группа.Если у вас нет поддержки прокси, вам нужно будет выполнить выборку для БД для группы, чтобы иметь возможность использовать сущность.Вот возможный код:

$group = $em->getRepository('Group')->findOneById(1);

С поддержкой Прокси вам не нужно выполнять поиск в БД.Прокси считается ссылкой на объект БД, фактически не извлекая его.Ваш код:

$group = $em->getReference('Group', 1);

Преимущество наличия прокси проста ... если вам нужно (например) получить имя группы, просто сделайте это обычно: $ group-> getName ();И Proxy инициализирует Entity (выборка БД по требованию).

Репозиторий - это манипуляция данными.Вы используете его для управления своими сущностями.Таким образом, вы можете найтиById, findOneByEmail и т. Д. Вы также можете расширить его основные функциональные возможности и реализовать свои собственные методы для управления вашими сущностями, такие как: saveUser, retrieveMostActiveUsers.

Служба использует внутренние хранилища, но содержит больше проверки иможет взаимодействовать с> 1 хранилищем.Например, после успешного сохранения пользователя вы хотите отправить ему электронное письмо с поздравлением.Таким образом, в вашем методе createUser UserService вы извлекаете NotificationService и отправляете новое регистрационное письмо.

Понятно ли вам это сейчас?=)

Ура,

...