Model view controller MVC:在哪里触发用户注册电子邮件

Model view controller MVC:在哪里触发用户注册电子邮件,model-view-controller,zend-framework,Model View Controller,Zend Framework,我正在构建一个MVC应用程序(使用Zend框架) 当用户首次注册时,应用程序会向他们发送一封电子邮件。我的问题是,我应该从哪里触发此电子邮件?模型还是控制器?我的想法如下: 在某些方面,该模型是有意义的,因为发送注册电子邮件是我业务逻辑的一部分。用户必须单击邮件中的链接以验证其电子邮件地址 但把它放在模型中,我就是在“阻碍”模型。该模型的registerUser操作仅在每次注册都需要发送电子邮件的应用程序上下文中有用 相反,通过从控制器内部触发电子邮件,我的控制器会稍微“胖”,但我的模型会稍微

我正在构建一个MVC应用程序(使用Zend框架)

当用户首次注册时,应用程序会向他们发送一封电子邮件。我的问题是,我应该从哪里触发此电子邮件?模型还是控制器?我的想法如下:

  • 在某些方面,该模型是有意义的,因为发送注册电子邮件是我业务逻辑的一部分。用户必须单击邮件中的链接以验证其电子邮件地址

  • 但把它放在模型中,我就是在“阻碍”模型。该模型的registerUser操作仅在每次注册都需要发送电子邮件的应用程序上下文中有用

  • 相反,通过从控制器内部触发电子邮件,我的控制器会稍微“胖”,但我的模型会稍微“细粒度”

我已经编写了一个电子邮件服务,它实际配置并发送电子邮件,我认为这是一个很好的设计决策。我真的只是问我应该从哪里打这个服务


非常感谢您的想法

您可能希望研究使用类似的方法将发送到电子邮件服务的邮件排队

通过这种方式,您可以让NServiceBus订阅发生的事件,并忽略任何手动启动电子邮件服务等

最终,您需要一种故障保护方式,以确保您的消息传递给目标用户。这种框架将极大地帮助您确保实现这一点

或者,您可以将要发送的电子邮件存储在数据库中,并让您的电子邮件服务每隔x分钟检查一次数据库队列,以查找要发送的新电子邮件,而无需触发电子邮件发送

同样,这样做至少可以确保电子邮件得到发送。如果在发送每封电子邮件的过程中,网络出现故障或其他中断,您只需将它们留在队列中,直到网络恢复正常。

根据,您应该将从控制器发送电子邮件:

控制器…根据用户的请求决定显示哪个视图

另一方面,模型包含:

…一组抽象背后的基本功能


电子邮件可以被视为“视图”,因为它向用户显示信息。激活这个“视图”是控制器的工作。在我看来,我想在模型中需要这个,因为我认为这是一个假设的创建用户方法的过程,而不是与请求的用户的任何特定的交互。
换句话说,由于我总是希望发送此电子邮件,无论请求的来源如何,我都会将其标识为创建用户操作的自然副产品,类似于保存在数据库中的记录。

这并不能回答问题。即使OP决定使用你的产品,他仍然需要知道何时调用它。这是我的观点-他不需要调用它。总线(无论他是什么总线框架)将配置一个事件,当发生某些事情时,例如用户被插入数据库时,该事件将触发。这样就不需要手动触发电子邮件。同样在我的第二个建议中,也没有必要打电话给任何人。该服务将负责从数据库中查找要发送的电子邮件。在这种情况下,他可能需要的是一个自定义事件设置,用于侦听插入到数据库中的新项目,并在数据库中生成相关的电子邮件消息。也许你的观点超出了我的理解范围。然而,当你说“总线…将配置一个事件”时,你似乎准确地描述了OP所引用的内容:应该激活电子邮件服务的时间/事件/操作/任何内容。电子邮件发送者是外部服务还是内置于框架中并不重要;触发它的任务是相同的。至于第二点,外部服务是不必要的开销。OP没有要求额外的电子邮件相关功能,因此仅为此配置一个侦听器似乎有点过头了。嘿,乔治。我想我们只是在想一些不同的事情。关于你评论的第二部分,OP说他们已经写了一个电子邮件服务。我的建议是,与其从网站代码触发电子邮件服务,不如该服务每隔x分钟检查一次数据库,以便发送新的电子邮件。这就是我要做的。允许我扮演魔鬼代言人,但模特不也一样好吗$user=新用户()$用户->发送电子邮件(“欢迎!”);需要指出的是,这确实值得商榷,这将取决于程序员的偏好和最终目标。无论你选择什么,只要保持一致。@brady.vitrano谢谢你的评论。正如你所说,偏好当然起了作用,而且没有硬性规定。但是,当ZF文档引用“基本功能”时,我假设它是指添加/删除/更新等过程。如果模型可以发送电子邮件,为什么HTML输出(视图)不能呢?作为旁注,这个问题在过去和其他地方都曾被讨论过,但没有达成明确的共识。@brady。你的建议违反了一个清晰的关注点分离。用户就是用户,他们不应该同时负责发送电子邮件。如果有什么问题的话,至少应该有一些负责电子邮件发送的东西,而不是像你介绍的那样与系统中的其他类型绑定。@jamie和@george谢谢你的回复。我完全同意。