大佬教程收集整理的这篇文章主要介绍了php – 域驱动设计和ORM限制,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下是域层的示例:
/** * Simple value object */ class ProductId { private $value; function __construct($value) { $this->value = $value; } public function value() { return $this->value; } } /** * Example dependency */ class Dependency { public function doNothing() { } } /** * Game class done in a DDD mAnner */ class Game { /** * @var ProductId */ private $id; /** * @var String */ private $title; /** * @var Dependency */ private $dependency; function __construct(ProductId $id,$title,Dependency $dependency) { $this->id = $id; $this->title = $title; // Validation Assertion::minLength(25,$titlE); } /** * @return ProductId */ public function getId() { return $this->id; } /** * @return String */ public function gettitle() { return $this->title; } public function someBehavior() { $this->dependency->doNothing(); } }
现在使用Doctrine,您可以使用XML或YAML映射将Game映射到某个表.
但是在调用$gameRepository-> productOfId($somEID)时;你会得到一个畸形的对象.原因如下:
>由于Doctrine2在调用getId()时不支持值对象,因此您将获得一个普通的int,因为它的映射将指向一个整数列.最新的beta有点支持它们,但它仍然不是很灵活,在更复杂的场景中也不容易配置.
>由于Doctrine2在获取的实体上调用someBehavior()时创建用于检索的代理对象,因此代理对象无法解析构造函数依赖性,因此会出现致命错误.这可以通过创建一些DomainRegistry单例并从那里获得依赖来实际克服,但我真的不喜欢这暗示在我身上.但是我们仍在跳过验证,因为没有调用构造函数,我不会仅仅依赖于数据库完整性.
我应该如何克服这个问题?我宁愿不使用if if int返回我的域模型中的ProductId(int)内容,因为我希望我的域层是持久性无知的.
我想到的一件事是(假设我会坚持使用ORM,而不仅仅是DBAL)来处理像DTO这样的Doctrine实体(我希望我在这里正确使用该术语)并从中组装域对象.所以除了提到的课程,我还有类似的东西:
/** * Doctrine entity treated like a pure value container */ class GameDTO { private $id; private $title; /** * @return int */ public function getId() { return $this->id; } /** * @return String */ public function gettitle() { return $this->title; } } class DoctrineGameRepository { /** * @var Dependency */ private $dependency; /** * Doctrine's entity manager */ private $em; function __construct(Dependency $dependency,$em) { $this->dependency = $dependency; $this->em = $em; } public function productOfId($id) { /** @var GameDTO $gameDto */ $gameDto = $this->em->find($id); return new Game($gameDto->getId(),$gameDto->gettitle(),$this->dependency); } }
这样我就克服了基础设施的限制,但它增加了另一层复杂性.另外,我应该如何处理需要反映到我的DTO的对象的更改,以便我可以更新我的数据库?
我的第二个想法是改编CQRS,但这对我来说只是一个流行语,因为我还没有对它进行太多的研究.我知道它的原则,但我不知道我应该为哪个类和存储库建模.
你会如何处理所有这些?
ORM的限制是否会影响您的DDD设计?
我大部分时间都在java中编码,而且我知道hibernate是如何发展的,3年前甚至hibernate都不支持值对象,对嵌入式对象的支持也很幼稚,看起来Doctrine2就在那个阶段
我认为,一旦你倾向于CQRS,ORM的神奇之处就越少,我认为CQRS和DDD齐头并进,如果单独实施,CQRS相当于simple,只有当ES被添加到方程式中才会变得复杂( ES有它的好处).
因此,我建议您使用基本的CQRS来处理您想要使用DDD概念的所有项目.所以从这里我们可以假设你有一个Finder / Query类来管理你的查询,这些应该是直接的SQL
不要让我们深入了解存储库中的内容.一旦我们从存储库中获取了查询,那么存储库实际上很简单,它所暴露的接口将非常紧密,这是一个例子.
public interface Repository<T> { T load(Object aggregatEIDentifier); void add(T aggregatE); void update (T aggregatE); }
您可以为系统中的每个聚合实现一个实现.
在这里,您可以按照您认为合适的方式处理结果集中的聚合.这可能是一些努力,但成本可以跨项目摊销,你可以免除所有的ORM黑魔法:)
以上是大佬教程为你收集整理的php – 域驱动设计和ORM限制全部内容,希望文章能够帮你解决php – 域驱动设计和ORM限制所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。