Php 当使用条令2和Zend框架时,业务逻辑应该放在哪里
我有一个关于条令2和Zend框架的问题 如果默认情况下使用Zend Framework而不使用条令,则将业务逻辑放在模型中。但是,由于条令2确实有实体,业务逻辑应该放在哪里 我首先创建了实体管理器调用实体的模型。但是当我想为我的模型编写单元测试而不需要数据库调用时。我需要将实体管理器移动到控制器。但我的控制器中的业务逻辑并不好 下面的代码显示控制器操作的一部分: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);
$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的关系映射创建的对象引用),可以访问每个协作中需要的每个对象,因此实体中不需要实体管理器。