3

Ну, я пытаюсь представить себя DDD, я очень новичок в этом, и некоторые понятия до сих пор не ясны.Как реализовать DDD с Doctrine2 в проекте Symfony2?

Вот что я понял до сих пор:

  • Домен в основном о данных
  • Настойчивость слой не привязан к домену, но бизнес-логика сделка может быть.

При использовании Doctrine2 мы используем либо EntityRepository, либо реализацию CustomEntityRepository.

В DDD шаблон хранилища выглядит несколько иначе, я просмотрел примеры Java, а также сообщения из списка рассылки DDD, и люди склонны сообщать, что репозиторий должен возвращать QueryObject в Doctrine2, Я пытаюсь вернуть экземпляр QueryBuilder из моего репозитория.

Поэтому, чтобы скрыть сложность работы с QueryBuilder, а затем Query, а затем Hydrated result set, я реализовал другой сервисный уровень, который я назвал менеджером.

Вот как мой домен выглядит следующим образом:

src/Domain/ 
├── Entity 
│   ├── AbstractComment.php 
│   ├── Comment.php 
├── Manager 
│   ├── CommentManager.php 
└── Repository 
    └── CommentRepository.php 

Папка Entity только о чистом POPO.

CommentRepository выглядит следующим образом:

<?php 
namespace Acme\Domain\Repository; 

use Doctrine\Common\Collections\Criteria; 

class CommentRepository 
{ 
    private $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    /** 
    * @param $id 
    * 
    * @return \Doctrine\ORM\QueryBuilder 
    */ 
    public function findOneById($id) 
    { 
     $qb = $this->getEntityManager() 
      ->getRepository('Acme:Domain\Entity\Comment') 
       ->createQueryBuilder('c'); 

     $criteria = new Criteria(); 

     $criteria->andWhere(
      $criteria->expr()->eq('c.id', ':id') 
     ); 

     $qb->addCriteria($criteria); 

     $qb->setParameter('id', $id); 

     return $qb; 
    } 
} 

И в CommentManager:

<?php 

namespace Acme\Domain\Manager; 

class CommentManager 
{ 
    protected $repository; 

    public function __construct(CommentRepository $repository) 
    { 
     $this->repository = $repository; 
    } 

    public function findOneById($id) 
    { 
     return $this->repository->findOneById($id)->getQuery()->getOneOrNullResult(); 
    } 
} 
  1. ли это правильный подход к управлению "субъекты"?
  2. Следуя такой схеме, где я должен обрабатывать упорство?

Я имею в виду, если я прав, репозиторий в основном, как коллекции, поэтому он должен обеспечивать add(Entity $e) и remove(Entity $e) методы, но где я на самом деле сохраняется сущность?

Безопасно ли это в пределах add() & remove() методов? Лучше ли добавить метод save() для обработки обновлений?

Спасибо за ваше время.

+0

Если вы хотите просто найти «findOneById» в своем менеджере, вы также можете просто: '$ this-> repository-> find ($ id)' (предполагая, что 'id', на который вы ссылаетесь, является вашим основным ключом). –

+0

@ColinMorelli, я знаю, это было ради примера. Это не о DDD:) – Trent

+0

@Trent В настоящее время у меня похожая структура: репозиторий читает только в любом случае, и я передаю репозиторий также потребителям менеджера (менеджер не является центральной точкой). Объект менеджера в основном обрабатывает логику, связанную с сохранением сущностей для меня, что включает в себя также все связанные с бизнес-логикой изменения и события, связанные с нашими объектами. Я избегаю проксирования вызовов от менеджера к хранилищам: в долгосрочной перспективе становится неприятным и раздражающим: если вам действительно нужно обработать некоторую логику во время извлечения, свяжите менеджера с репозиторием через прослушиватель/события. – Ocramius

ответ

8

Я начал серию о DDD с Symfony2, которая должна ответить на ваши вопросы: http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/.

Я имею в виду, если я прав, репозиторий в основном как коллекция

Да.

поэтому он должен предоставить надстройку (Entity $ е) и удалить (Entity $ е) методы

Да.

но где я на самом деле сохраняю сущность?

В этом репозитории. Однако, вероятно, это не репозиторий Doctrine. В Doctrine используются термины Entity/Repository, но они не имеют того же значения в DDD.

+0

Я думаю, что хранилище в доктрине похоже на DbSet в Entity Framework? –

+0

Что было бы хорошо, это конкретный пример уровня инфраструктуры, выполняемого в symfony, с доктриной как один из вариантов сохранения. Я чувствую, что в голове все ясно, кроме той части, которую я предполагаю, поскольку я привык использовать Doctrine Entities, которые напрямую привязаны к базе данных. – vodich

Смежные вопросы