业务逻辑是否应该与模型分离


Should the business logic be separate from the model?

我们正在做一个相当代码化的PHP5项目,上周我做了一个RESTful API的PoC。我们正在将模型类与业务类分离。

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

考虑到这一点,我想到了以下问题:

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

  • 之前与django进行了大量的工作,其中大多数业务逻辑都是在模型中实现的,为什么要将业务逻辑分开呢?你有现实生活中的例子吗?这能解决什么问题(如果有的话)?

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

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

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

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

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

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

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

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

与数据交互的最佳方式是什么模型的灵活性和保持模型的功能现在不在乎(比如用更改电子邮件地址时的激活链接)?

我不完全理解。在我看来,无论如何,您都应该将发送电子邮件的过程与正常的代码运行分开。所以把它排成一排,然后在那里找到它。它不是正常代码路径的一部分。你可以从你的模型开始,但仅此而已。

请参阅此问题,其中包含有关该主题的相关信息:Cakephp-cron作业调用一个控制器';s动作