业务逻辑是否存在于模型或控制器中?

Den*_*nis 1 model-view-controller business-logic mvvm

在阅读https://softwareengineering.stackexchange.com/questions/165444/where-to-put-business-logic-in-mvc-design/165446#165446后,我仍然对要将代码放置在何处感到困惑计算折扣。我认为计算产品或服务的折扣价绝对是业务逻辑的一部分,而不是应用程序路由或数据库交互的一部分。因此,我正在努力将业务逻辑放在何处。

class Model
{
    public function saveService($options)
    {
        $serviceId = $options['service_id'];

        //Model reads "line Item" from database
        $service = $this->entityManager->find('Entity\ServiceLineItem', $serviceId);
        //uses the data to compute discount
        //but wait.. shouldn't model do CRUD only?
        //shouldn't this computation be in Controller?   
        $discount = ($service->getUnitPrice() * 0.25);

        // Add the line item
        $item = new SalesItem();
        $item->setDiscount($discount);
    }
}


class Controller
{
    function save()
    {
        $this->model->saveService($options);
    }
}
Run Code Online (Sandbox Code Playgroud)

题:

$discount计算之上,它应该留在模型中还是应该留在Controller中?如果进入控制器,则控制器必须先调用$service(通过模型),然后$discount在控制器内部进行计算,然后将其值发送回要保存的模型。那是这样做的方式吗?

注意

我可能会将模型与“存储”混淆。我可能需要一个执行业务逻辑的模型,而数据库/持久性存储应该是一个单独的层。

Air*_*cer 5

业务逻辑属于服务,因此您需要添加服务层。

业务逻辑倾向于跨越多个模型,这表明它不属于任何单个模型。因此,尚不清楚应将逻辑放在哪种模型中。

输入服务等级。我倾向于为软件设计的每个用例提供服务。在您的情况下,可能会有a CheckOutService来计算您的总金额,包括折扣。这样,每个服务都有特定且直观的目的。然后,当控制器需要某种业务逻辑时,它将调用专门为此目的而定制的服务。

可以在这里找到有关服务在MVC模式中的功能的良好描述: MVCS-模型视图控制器服务

我将引用最重要的部分:

然后,服务层将负责:

  • 从各种数据源(或数据访问对象)检索并创建“模型”。
  • 跨各种存储库/资源更新值。
  • 执行特定于应用程序的逻辑和操作等。

编辑:我刚刚看到凯耶斯的答案。我会说他的答案比我的答案更精确,但是鉴于您的问题的不确定程度,我不知道它的相关性。因此,我希望我的工作可以在编程生涯的早期阶段为某些人提供帮助。