【问题标题】:Should the business logic be separate from the model?业务逻辑是否应该与模型分开?
【发布时间】:2012-07-20 23:21:13
【问题描述】:

我们正在开发一个代码量很大的 PHP5 项目,上周我在开发一个 RESTful API 的 PoC。我们将模型类与业务类分开。

我发现,尝试实现 CRUD 功能时,直接针对模型实现 CRUD 会非常简单,而针对业务逻辑实现则不然,因为它的功能特定于当前现有的视图,并且它的接口不'不提供实现 API 所需的通用数据访问模型。

想到这里,我想到了以下问题:

  • 与数据交互的最佳方式是什么,保持模型的灵活性保持模型目前不关心的功能(例如发送邮件更改电子邮件地址时的激活链接)?

  • 以前使用 django 工作很多,其中大部分业务逻辑都在模型中实现,为什么还要保持业务逻辑分离?你有现实生活中的例子吗?这解决了哪些问题(如果有的话)?

我也想到了一些可能的解决方案:

  • 将整个业务逻辑放入模型中。在调用 save 方法之后/之前检查哪些字段发生了变化。
  • 使用观察者模式通知业务对象模型的变化并直接与模型交互。

你认为有什么优点和缺点,你会怎么做?

【问题讨论】:

  • 在 MVC 中,模型不是数据库(或其他一些持久性)。 MVC 中的模型是解决业务问题的重要算法所在。碰巧模型通常与数据库通信,通常@Luc Franken 通过数据访问层(即网关、数据访问、Active Record 和/或数据传输对象)写入。

标签: php model-view-controller design-patterns rest


【解决方案1】:

如果您将数据存储分离为数据访问层,您将获得所需的分离和模型中的功能:

DAL (doing queries etc)
  |
Model (doing business)
  |
Controller
  |
View

因此,在视图中您有一个操作:标记为已付款。因此,您的控制器获取请求 (POST) /invoice/1/markaspaid (或您使用的任何其他 url 结构)。然后控制器调用模型:

$Invoice=new Invoice();
$Invoice->markAsPaid(1);

然后您的模型调用 DAL 来实际存储此更改。没有必要将其与模型分开。如果它非常复杂或事务性很强,您可能会考虑为复杂任务提供单独的服务。这样你的模型会变得更薄,复杂的部分也会被分离。

与数据交互的最佳方式是什么? 模型的灵活性并保持模型的功能 目前不在乎(例如发送带有 更改电子邮件地址时的激活链接)?

我完全不明白这一点。据我所知,您应该将发送电子邮件过程与您的正常代码运行分开。所以把它放在一个队列中,然后在那里找到它。它不是您正常代码路径的一部分。您可以从您的模型中启动它,但仅此而已。

请参阅此问题,其中包含有关该主题的相关信息: Cakephp cron job to call a controller's action

【讨论】:

  • 感谢您的回答!我们已经分离了发送电子邮件的过程。我的意思是,直接更改数据的最佳方法是什么(例如$user->email = "foo@bar.com";),而不会失去执行特定值更改时必须完成的额外任务的可能性。
  • 我希望你现在能理解我,如果我的英语让我难以理解,我很抱歉;)
  • 你真的要为模型写辛苦吗?那应该怎么保存呢?我总是会调用像 $Invoice->save(); 这样的方法。所以您真正决定何时在数据存储中更新数据。
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2010-10-10
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多