我应该在存储库中保存相关模型吗?

时间:2016-03-02 17:59:03

标签: laravel domain-driven-design

我正在与Laravel合作近两年,并试图了解使用存储库和DDD的所有好处。我仍然在努力使用最佳实践来处理数据和模型,以获得更好的代码可重用性和更好的架构。

我见过其他开发人员建议在工厂生成模型,然后使用Repositories来保存这些模型,如:

public function add(User $user)
{
    return $user->save();
}

但我应该怎么做,以防我的用户模型有与之相关的模型,如图像,描述和设置。

我应该为每个模型创建存储库并在控制器中调用 - > add()函数4次,还是应该将保存逻辑放在UserRepository中?> add()函数传递所有模型以及用户?另外,更新功能怎么样,逻辑也可能相当复杂。

更新 - 我需要的是一个实现的实例。

2 个答案:

答案 0 :(得分:1)

我不是一个PHP人,但是从我能找到的,Laravel是一个MVC框架,与DDD无关。

检查this presentation,它不会进行域建模,更专注于策略,但至少它有一些好处,如命令处理和域事件,简要解释具有活动记录的存储库。

在最后一张幻灯片中也提到了两本标志性的DDD书籍,我建议你也看看它们。

答案 1 :(得分:1)

总是很难处理"正确的方式"的问题。但这是一种方式。

从DDD角度来看,在此特定上下文中,将User对象视为聚合根实体,将其他对象视为子值对象。

$description = new UserDescripton('Some description');
$image1 = new UserImage('head_shot','headshot.jpg');
$image2 = new UserImage('full_body','fullbody.jpg');

$user = new User('The Name',$description,[$image1,$image2]);

$userRepository->persist($user);

首先要注意的是,如果您真的想尝试应用一些ddd概念,那么从领域模型的角度思考而不必担心如何坚持它们是很重要的。如果你发现你基本上是在写一个带有一堆getter和setter的CRUD应用程序而且几乎没有业务逻辑,那么几乎忘了它。你最终要做的就是增加复杂性而没有多大价值。

持久行是用户存储的位置。你当然不想写一堆代码来存储和更新孩子。同样,为值对象创建存储库通常会浪费精力。如果你要走这条路,那么你真的需要某种理解单个对象及其关系的数据库层。这是关系的关键。

我假设您使用的是Laravel的Eloquent活动记录持久层。我不熟悉它,知道持久化和更新聚合根是多么容易。

我展示的代码实际上更多地基于Doctrine 2对象关系映射器,并且几乎可以开箱即用。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/将它与Laravel集成很容易。

但即使是Doctrine 2主要是面向CRUD的。在不同的域上下文中,将区别对待用户对象。它可以开始涉及到基本上具有针对不同上下文的不同用户实现。因此,请确保域层中的收益值得付出努力。