我应该将相关模型保存在存储库中吗?
Should I save related models in repository?
我在 Laravel 工作了将近两年,并试图了解使用存储库和 DDD 的所有好处。我仍然在为如何使用最佳实践来处理数据和模型以获得更好的代码可重用性和更好的架构而苦苦挣扎。
我看到其他开发人员建议在工厂中生成模型,然后使用存储库来保存这些模型,例如:
public function add(User $user)
{
return $user->save();
}
但是如果我的用户模型有与之相关的模型,比如图像、描述和设置,我该怎么办。
我应该为每个模型创建存储库并在控制器中调用 ->add() 函数 4 次,还是应该将保存逻辑放在传递所有模型和用户的 UserRepository ->add() 函数中?另外,update函数怎么样,那个逻辑也可能相当复杂。
更新 - 我需要的是一个带有实现的实际例子。
我不是 PHP 人,但据我所知,Laravel 一个 MVC 框架,与 DDD 无关。
检查this presentation,它不去领域建模,更专注于战术但至少它有一些优点,如命令处理和领域事件,简要说明具有活动记录的存储库。
它还在最后一张幻灯片中引用了两本标志性的 DDD 书籍,我建议你也看看那些。
"right way" 问题总是很难处理。但这是一种方法。
从 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 Object Relation Mapper,并且开箱即用。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/ 很容易将它与 Laravel 集成。
但即使是 Doctrine 2 也主要是面向 CRUD 的。在不同的域上下文中,用户对象将被区别对待。它可以开始涉及到基本上针对不同的上下文有不同的用户实现。因此,请确保领域层的回报是值得的。
我在 Laravel 工作了将近两年,并试图了解使用存储库和 DDD 的所有好处。我仍然在为如何使用最佳实践来处理数据和模型以获得更好的代码可重用性和更好的架构而苦苦挣扎。
我看到其他开发人员建议在工厂中生成模型,然后使用存储库来保存这些模型,例如:
public function add(User $user)
{
return $user->save();
}
但是如果我的用户模型有与之相关的模型,比如图像、描述和设置,我该怎么办。
我应该为每个模型创建存储库并在控制器中调用 ->add() 函数 4 次,还是应该将保存逻辑放在传递所有模型和用户的 UserRepository ->add() 函数中?另外,update函数怎么样,那个逻辑也可能相当复杂。
更新 - 我需要的是一个带有实现的实际例子。
我不是 PHP 人,但据我所知,Laravel 一个 MVC 框架,与 DDD 无关。
检查this presentation,它不去领域建模,更专注于战术但至少它有一些优点,如命令处理和领域事件,简要说明具有活动记录的存储库。
它还在最后一张幻灯片中引用了两本标志性的 DDD 书籍,我建议你也看看那些。
"right way" 问题总是很难处理。但这是一种方法。
从 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 Object Relation Mapper,并且开箱即用。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/ 很容易将它与 Laravel 集成。
但即使是 Doctrine 2 也主要是面向 CRUD 的。在不同的域上下文中,用户对象将被区别对待。它可以开始涉及到基本上针对不同的上下文有不同的用户实现。因此,请确保领域层的回报是值得的。