gpt4 book ai didi

php - DDD 和 MVC : Difference between 'Model' and 'Entity'

转载 作者:IT王子 更新时间:2023-10-29 00:41:18 24 4
gpt4 key购买 nike

我对 MVC 中“模型”的概念感到非常困惑。当今存在的大多数框架都将模型置于 Controller 和数据库之间,而模型几乎就像一个数据库抽象层。随着 Controller 开始执行越来越多的逻辑,“胖模型瘦 Controller ”的概念消失了。

在DDD中,还有Domain Entity的概念,Domain Entity对它有唯一的标识。据我了解,用户是实体的一个很好的例子(例如,唯一的用户 ID)。实体有一个生命周期——它的值可以在整个操作过程中改变——然后它被保存或丢弃。

我上面描述的实体是我认为模型应该在 MVC 中的什么?我有多离谱?

为了让事情变得更加困惑,您引入了其他模式,例如 Repository 模式(可能会在其中放置一个服务)。很清楚存储库如何与实体交互——它如何与模型交互?

Controller 可以有多个模型,这使得模型看起来不像是“数据库表”,而是一个独特的实体。

更新: In this post模型被描述为具有知识的东西,它可以是单一的,也可以是对象的集合。所以它听起来更像是一个实体和一个模型或多或少是相同的。模型是一个包罗万象的术语,其中实体更具体。值对象也可以是模型。至少在 MVC 方面。也许???

那么,粗略地说,哪个更好?

真的没有“模型”......

class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}

或者这个,它有一个模型作为 DAO?

class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}

这两个示例甚至都没有执行我上面描述的操作。我显然迷路了。有什么意见吗?

最佳答案

实体

Entity 是指一个对象,它是业务逻辑所使用的单个项目,更具体地说是那些具有某种身份的对象。
因此,许多人将 ORM 映射对象称为实体。

有些人将类称为“实体”,该类的一个实例表示数据库中的单个行。

有些人更喜欢只称这些类中的那些为“实体”,其中还包含业务规则、验证和一般行为,他们称其他为“数据传输对象”。

型号

Model 与应用程序的 UI(=View)和控制流(=Controller)没有直接关系,而是关于数据访问的方式和应用程序的主要数据抽象的工作方式。

基本上,任何东西都可以成为符合上述条件的模型。

MVC

您可以使用实体作为 MVC 中的模型。它们表示两个不同的事物,但可以同时调用相同的类。

示例

  • Customer 类在很大程度上是一个实体(通常),您还可以将其用作应用程序中数据访问的一部分。在这种情况下,它既是实体又是模型。
  • Repository 类可能是模型的一部分,但显然不是实体。
  • 如果您在业务逻辑层中间使用了一个类,但没有向应用程序的其余部分公开,它可能是一个实体,但从 MVC 的角度来看,它显然不是模型应用程序。

你的例子

至于你的代码示例,我更喜欢第一个。
模型是用作应用程序数据抽象手段的类,而不是名称后缀为“模型”的类。许多人认为后者是英国媒体报道软件。

您几乎可以将 Repository 类视为模型的一部分,即使它的名称没有以“Model”为后缀也是如此。

我要补充的是,使用第一个代码也更容易,对于以后可能需要理解您的代码的其他人来说,它更容易理解。

关于php - DDD 和 MVC : Difference between 'Model' and 'Entity' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3029952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com