我正在使用数据映射器/网关设计模式。
所以我有一个:
映射器; 网关; 域对象(主要是getter和setter); 控制器; 一个观点。
我的问题是:我应该在哪里实例化Zend Mail? 我认为这个观点显然是不可能的,而且网关也是不被考虑的。
控制器应保持清洁,所以:
映射我们的域对象?
如果我们的表单有一些将从数据库中检索数据的选择框,那么Mapper将是最适合实例化Zend Mail的地方吗?
由于
答案 0 :(得分:2)
Hmmmm?使用Zend,您可以在引导程序中配置Zend_Mail,也可以使用application.ini文件或其他配置文件。这就是我现在配置我的方式。对于dev,我会将邮件写入文件并进行测试,我将通过实际的邮件服务器进行邮件。
我在一个叫做Mail_Service的类中实例化我的Zend_Mail实例。此邮件服务类将在需要发送邮件时在内部创建Zend_Mail实例,并且如果已创建一个Zend_Mail实例并且需要发送更多邮件,则将使用现有Zend_Mail实例。
它有方法可以为我发送预定义的邮件。例如,
Mail_Service->sendWelcomeEmail( $userInfo )
OR
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 );
}
我不知道这是否是最好的方法,但这样我的服务就有了功能 与服务相关的名称并捕获整个工作流,而不是仅将调用转发给其他对象的原子操作。
希望这有帮助。
答案 1 :(得分:1)
我总是保留在我的控制器中发送邮件的代码。
模型 - 数据库/业务逻辑
查看 - html /表示层
控制器 - 执行操作的代码。