Ну, я пытаюсь представить себя 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();
}
}
- ли это правильный подход к управлению "субъекты"?
- Следуя такой схеме, где я должен обрабатывать упорство?
Я имею в виду, если я прав, репозиторий в основном, как коллекции, поэтому он должен обеспечивать add(Entity $e)
и remove(Entity $e)
методы, но где я на самом деле сохраняется сущность?
Безопасно ли это в пределах add()
& remove()
методов? Лучше ли добавить метод save()
для обработки обновлений?
Спасибо за ваше время.
Если вы хотите просто найти «findOneById» в своем менеджере, вы также можете просто: '$ this-> repository-> find ($ id)' (предполагая, что 'id', на который вы ссылаетесь, является вашим основным ключом). –
@ColinMorelli, я знаю, это было ради примера. Это не о DDD:) – Trent
@Trent В настоящее время у меня похожая структура: репозиторий читает только в любом случае, и я передаю репозиторий также потребителям менеджера (менеджер не является центральной точкой). Объект менеджера в основном обрабатывает логику, связанную с сохранением сущностей для меня, что включает в себя также все связанные с бизнес-логикой изменения и события, связанные с нашими объектами. Я избегаю проксирования вызовов от менеджера к хранилищам: в долгосрочной перспективе становится неприятным и раздражающим: если вам действительно нужно обработать некоторую логику во время извлечения, свяжите менеджера с репозиторием через прослушиватель/события. – Ocramius