1

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

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

我真的很喜欢它的工作方式,但是我对这将如何影响我过去拥有模型和映射器的方式感到困惑。

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

假设我们有用户实体和购买,如 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 中已停止支持的东西或什么。

4

1 回答 1

2

向模型中添加不受 Doctrine 管理的方法和属性应该没有问题。对于映射器,Doctrine 不需要它们。Doctrine 已经处理了映射(例如,通过实体类中的注释)和(复杂的)查询,您拥有 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,它从用户那里获取电子邮件地址并发送电子邮件 - 它不会。

于 2012-06-11T06:31:15.733 回答