繁体   English   中英

在使用Doctrine 2和Zend Framework时,应该在哪里放置业务逻辑

[英]Where should the business logic be placed when using Doctrine 2 and Zend Framework

我有一个与Doctrine 2和Zend Framework有关的问题。

如果默认使用Zend Framework而不使用Doctrine,则将业务逻辑放在模型中。 但是,由于Doctrine 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();

有人可以说这个问题的最佳做法是什么? 谢谢

我不确定是否有一个商定的最佳实践,但在讨论Doctrine或Zend Framework时,我看到很多关于Service Layers的讨论。

当我使用Doctrine启动我的应用程序时,我尝试尽可能多地在我的Entity对象中构建功能,但很快就意识到如果不注入实体管理器几乎是不可能的,这完全打破了普通的,非持久性感知对象的想法。使Doctrine 2变得如此美好。

如果您来自Active Record世界,很容易将您的“模型”视为对应于数据库表的单个对象,并且控制器必须与这些对象进行通信。 对于非常简单的CRUD应用程序,这通常是可以的。 但是由于Doctrine的方法,这样做是奇怪和令人沮丧的。

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

我建议你查看这个主题的演示文稿

UPDATE

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

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

https://github.com/eddiejaoude/Zend-Framework--Doctrine-ORM--PHPUnit--Ant--Jenkins-CI--TDD-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM