我正在使用数据映射器/网关设计模式。
所以我有一个:
映射器;网关;域对象(主要带有 getter 和 setter);控制器;一个看法。
我的问题是:我应该在哪里实例化 Zend Mail ?我相信这种观点显然是毫无疑问的,而且网关也不值得考虑。
控制器应保持清洁,因此:
映射我们的域对象?
如果我们的表单会有一些从数据库中检索数据的选择框,那么,也许 Mapper 将是最适合实例化 Zend Mail 的地方?
谢谢
我正在使用数据映射器/网关设计模式。
所以我有一个:
映射器;网关;域对象(主要带有 getter 和 setter);控制器;一个看法。
我的问题是:我应该在哪里实例化 Zend Mail ?我相信这种观点显然是毫无疑问的,而且网关也不值得考虑。
控制器应保持清洁,因此:
映射我们的域对象?
如果我们的表单会有一些从数据库中检索数据的选择框,那么,也许 Mapper 将是最适合实例化 Zend Mail 的地方?
谢谢
嗯?使用 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 );
}
我不知道这是否是最好的方法,但是这样我的服务具有与服务相关的函数名称并捕获整个工作流,而不是只是将调用转发给其他对象的原子操作。
希望这可以帮助。
我总是在我的控制器中保留发送邮件的代码。
模型 - 数据库/业务逻辑
视图 - html / 表示层
控制器 - 做事的代码。