我最近使用此处介绍的方法将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搜索了一下,我发现了这个:
它说
一种名为Doctrine_Cli的脚手架工具,可以非常快速地从数据库中创建模型
但是我的scripts / doctrine.php文件中不存在命令“generate-models-db”。我不确定这是Doctrine在版本2中停止支持的内容还是什么。
答案 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不应该与模型耦合。
如果用户做了属于模型的内容。如果某些事情对用户起作用 - 在你的情况下是一个邮件程序,它从用户那里获取电子邮件地址并发送一封电子邮件 - 但事实并非如此。