2

我正在使用数据映射器/网关设计模式。

所以我有一个:

映射器;网关;域对象(主要带有 getter 和 setter);控制器;一个看法。

我的问题是:我应该在哪里实例化 Zend Mail ?我相信这种观点显然是毫无疑问的,而且网关也不值得考虑。

控制器应保持清洁,因此:

映射我们的域对象?

如果我们的表单会有一些从数据库中检索数据的选择框,那么,也许 Mapper 将是最适合实例化 Zend Mail 的地方?

谢谢

4

2 回答 2

2

嗯?使用 Zend,您可以在引导程序中或使用 application.ini 文件或其他一些配置文件来配置 Zend_Mail。这就是我现在配置我的方式。对于开发人员,我会将邮件写入文件,而对于测试,我将通过实际的邮件服务器发送邮件。

我在一个名为 Mail_Service 的类中实例化 Zend_Mail 实例。这个邮件服务类将在需要发送邮件时在内部创建一个 Zend_Mail 实例,如果已经创建了一个 Zend_Mail 实例并且需要发送更多邮件,它将使用现有的 Zend_Mail 实例。

它有可以为我发送预定义邮件的方法。例如,


Mail_Service->sendWelcomeEmail( $userInfo ) 

或者


Mail_Service->sendActivationEmail( $userInfo )

比如说我的控制器收到一个创建新用户的请求,那么我的代码的整体流程将是这样的

//in the controller
//process form from browser somehow

UserAccountService->createNewUser( $userInfo );



/////////////////
/// Within the user account service

public function createNewUser( $userInfo )
{
    $userMapper->createNewUser( $userInfo );
    $preferencesMapper->createDefaultPreferencesForUser( $userInfo );

    MailService->sendWelcomeEmail( $userInfo );
}

我不知道这是否是最好的方法,但是这样我的服务具有与服务相关的函数名称并捕获整个工作流,而不是只是将调用转发给其他对象的原子操作。

希望这可以帮助。

于 2011-05-09T21:23:11.860 回答
1

我总是在我的控制器中保留发送邮件的代码。

模型 - 数据库/业务逻辑

视图 - html / 表示层

控制器 - 做事的代码。

于 2011-05-09T20:10:51.680 回答