Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当使用条令2和Zend框架时,业务逻辑应该放在哪里_Php_Zend Framework_Doctrine_Business Logic - Fatal编程技术网

Php 当使用条令2和Zend框架时,业务逻辑应该放在哪里

Php 当使用条令2和Zend框架时,业务逻辑应该放在哪里,php,zend-framework,doctrine,business-logic,Php,Zend Framework,Doctrine,Business Logic,我有一个关于条令2和Zend框架的问题 如果默认情况下使用Zend Framework而不使用条令,则将业务逻辑放在模型中。但是,由于条令2确实有实体,业务逻辑应该放在哪里 我首先创建了实体管理器调用实体的模型。但是当我想为我的模型编写单元测试而不需要数据库调用时。我需要将实体管理器移动到控制器。但我的控制器中的业务逻辑并不好 下面的代码显示控制器操作的一部分: $customerAddress = $this->_model->save($values, $id);

我有一个关于条令2和Zend框架的问题

如果默认情况下使用Zend Framework而不使用条令,则将业务逻辑放在模型中。但是,由于条令2确实有实体,业务逻辑应该放在哪里

我首先创建了实体管理器调用实体的模型。但是当我想为我的模型编写单元测试而不需要数据库调用时。我需要将实体管理器移动到控制器。但我的控制器中的业务逻辑并不好

下面的代码显示控制器操作的一部分:

        $customerAddress = $this->_model->save($values, $id);

        $this->_em->persist($customerAddress);

        // Update default billing address
        $defaultBilling = $this->_model->saveDefaultBilling($values, $customerAddress);
        if ($defaultBilling != FALSE) {
            $this->_em->persist($defaultBilling);
        }

        // Update default shipping address
        $defaultShipping = $this->_model->saveDefaultShipping($values, $customerAddress);
        if ($defaultShipping != FALSE) {
            $this->_em->persist($defaultShipping);
        }

        $this->_em->flush();

有人能说说这个问题的最佳做法是什么吗?Thx

我不确定是否有一致的最佳实践,但在讨论条令或Zend框架时,我看到了很多关于服务层的讨论

当我用Doctrine启动我的应用程序时,我试图将尽可能多的功能构建到我的实体对象中,但很快意识到,如果不注入实体管理器,这几乎是不可能的,这完全打破了让Doctrine 2如此美好的简单、非持久性感知对象的概念

如果您来自活动记录世界,很容易将您的“模型”视为与数据库表相对应的单个对象,并且控制器必须与这些对象通信。这通常适用于非常简单的CRUD应用程序。但由于教条的方法,这样做既奇怪又令人沮丧

相反,请考虑应用程序中的不同层。条令是一个位于数据库之上的层,您的实体位于条令之上,而您的服务层应该位于您的实体之上。整个包就是MVC中的M,它包括数据持久性和业务逻辑

我建议你看看这个主题

更新


我最初错过了您提到的单独模型对象调用实体的部分。我认为这是一种可以接受的模式。如果你想在不调用数据库的情况下编写测试,你可能会想使用实体管理器的模拟——不管你把它放在哪一层,它都是一个依赖项。

这是我使用的github骨架项目,它在引导程序中用Zend Franework 1.11.2进行了原则2的初始化,很好,很干净,使用实体模型和业务逻辑模型存储库。单元测试和ant构建脚本也适用于TDD开发人员


我认为最好将所有条令代码从控制器转移到域类中,请查看我的博客帖子:我认为这里的诀窍是设计您的模型,使其不受持久性的影响,也就是说,它可以通过到处调用新代码并从文本中设置属性来完全实例化。然后,通过遍历对象图(通过doctrine的关系映射创建的对象引用),可以访问每个协作中需要的每个对象,因此实体中不需要实体管理器。