Zend框架模型和Doctrine 2实体

时间:2012-06-11 04:05:45

标签: zend-framework doctrine-orm modelmapper

我最近使用此处介绍的方法将Doctrine 2集成到我的ZF应用程序中:

http://www.zendcasts.com/unit-testing-doctrine-2-entities/2011/02/

我非常喜欢它的工作方式,但是我对这将如何影响我以前使用我的模型和Mappers的方式感到困惑。

让我通过一个例子解释混乱,

假设我们在ZendCast

中给出的示例中有用户实体和购买

现在我有Doctrine使用的这些实体

/library/ZC/Entity
    User.php
    Purchase.php

以前我曾经

application/models/
    User.php (Application_Model_User)
    Purchase.php (Application_Model_Purchase)

在application / models /中的类中我曾经写过函数来对实体进行操作,(胖模型瘦控制器原理),例如,如果我想向用户发送电子邮件,我会在Application_Model_User中创建一个名为sendMail的方法

现在我不确定是否可以向/ library / ZC / Entity中的文件添加方法,或者它是一个好主意,因为Doctrine使用这些文件来管理数据库。

我宁愿拥有一个单独的模型文件,我也常常使用映射文件来处理多个模型,例如,如果我想通过电子邮件发送所有非活动用户,我会创建一个方法emailInactiveUsers到Application_Model_UserMapper。

我现在该怎么做?

我也用Google搜索了一下,我发现了这个:

http://net.tutsplus.com/tutorials/php/zend-framework-from-scratch-models-and-integrating-doctrine-orm/

它说

  

一种名为Doctrine_Cli的脚手架工具,可以非常快速地从数据库中创建模型

但是我的scripts / doctrine.php文件中不存在命令“generate-models-db”。我不确定这是Doctrine在版本2中停止支持的内容还是什么。

1 个答案:

答案 0 :(得分:2)

向不受Doctrine管理的模型添加方法和属性应该没问题。说到地图制作者,你不需要使用Doctrine。 Doctrine已经处理了映射(例如,通过Entity类中的Annotations)和(具有EntityManager / Repositories)的(复杂)查询。

我会将emailInactiveUsers()放在可以访问EntityManager的服务中,例如:

class UserMailService
{
    private $em;

    // Inject EntityManager, e.g. via setEntityManager() or __construct()

    public function emailInactiveUsers()
    {
        $mail = new \Zend_Mail();
        $users = $this->em->getRepository('User')->findBy(array('isActive' => false));
        foreach ($users as $user) {
            $mail->addTo($user->getEmail());
        }
        // And so on...
    }
}

我认为像sendMail()这样的东西属于服务,因为它作用于用户实体并且需要依赖于Mailer,而Mailer不应该与模型耦合。

如果用户做了属于模型的内容。如果某些事情对用户起作用 - 在你的情况下是一个邮件程序,它从用户那里获取电子邮件地址并发送一封电子邮件 - 但事实并非如此。