2011-07-06 57 views
3

我正在構建一個MVC應用程序(使用Zend Framework)。MVC:在哪裏觸發用戶註冊電子郵件

當用戶第一次註冊中應用程序發送一封電子郵件。我的問題是,我應該在哪裏觸發此電子郵件?模型還是控制器?我的想法如下:

  • 在某些方面,模型是有意義的,因爲發送註冊電子郵件是我業務邏輯的一部分。用戶必須點擊郵件中的鏈接才能驗證其電子郵件地址。

  • 但是,把它在模型中,我是「拖累」的模型。模型的註冊用戶操作僅適用於需要爲每次註冊發送電子郵件的應用程序。

  • 相反,通過控制器內觸發的電子郵件,我的控制器將成爲一個垃圾箱「胖」,但我的模型多一點「細粒」。

我寫這實際上配置,併發送電子郵件中的電子郵件服務,我認爲這是一個很好的設計決策。我真的只是問我應該從哪裏調用此服務。

您的想法是非常感謝!

回答

0

你可能要考慮使用像NServiceBus東西要排隊的消息被髮送到你的電子郵件服務。

這種方式,您可以有NServiceBus訂閱該事件發生,並省略電子郵件服務的任何人工燒製等

最終你要確保你的信息得到預期的人的故障保護方式。這種框架將極大地幫助您確保發生這種情況。

或者你可以存儲你的數據庫中要發送的電子郵件,讓您的電子郵件服務檢查數據庫隊列每隔x分鐘的新的電子郵件發送和省略需要觸發電子郵件發送。

再次,做這種方式將確保在至少該電子郵件被髮送。如果在發送每封電子郵件期間網絡出現故障或發生其他干擾,您可以將其保留在隊列中,直到網絡恢復正常。

+0

這不回答。問題即使OP決定使用你的產品,他仍然需要知道何時調用它 –

+0

這是我的觀點 - 。他不會需要調用它的總線(無論總線架構,他可能)將共同配置事件發生時會觸發的事件,例如用戶被插入到數據庫中。這省略了手動觸發電子郵件的必要。同樣在我的第二次消解中,再也沒有必要打電話了。該服務將負責查找從數據庫發送的電子郵件。他可能需要在這種情況下,是一個自定義事件設置偵聽新項目被插入到數據庫中,並生成培訓相關電子郵件到數據庫 –

+0

也許你是一個點超出了我的把握。然而,當你說「巴士...將配置一個事件」時,你似乎正在精確地描述OP引用的內容:時間/事件/動作/無論電子郵件服務應該被激活。如果電子郵件發件人是外部服務或內置在框架中,這並不重要;觸發它的任務是一樣的。至於你的第二點,外部服務是不必要的開銷。 OP沒有要求額外的電子郵件相關功能,所以爲此配置一個監聽器看起來像是矯枉過正。 –

2

Zend Framework's definition of MVC,你應該把從控制器發送電子郵件:

控制器......決定哪些查看基於用戶的請求顯示。

模型,在另一方面,包含:

...一組抽象的背後基本功能。

電子郵件可被視爲「視圖」,因爲它向用戶顯示信息。激活這個「視圖」是控制器的工作。「

+0

允許我扮演魔鬼的擁護者,但是模型不會一樣好嗎? $ user = new User(); $用戶> sendEmail( 「歡迎光臨!」);只要指出,這真的是爭論,並將取決於程序員的偏好和最終目標。無論你選擇什麼,只要保持一致。 –

+0

@ brady.vitrano感謝您的意見。正如你所說,偏好當然起着一定的作用,並沒有硬性規定。但是,當ZF文檔引用「基本功能」時,我認爲它指的是諸如添加/刪除/更新等過程。如果模型可以發送電子郵件,爲什麼不輸出HTML(視圖)呢?作爲一個側面說明,這個問題已經在SO之前解決:http://stackoverflow.com/questions/5017369/mvc-php-sending-mail-from-model和其他地方,沒有明確的共識。 –

+0

@brady。你的消化不良違背了清晰的問題分離。用戶是用戶,他們不應該也負責發送電子郵件。如果有的話,至少應該有一些負責電子郵件發送的東西,而不是像你提出的那樣綁定到系統中的其他類型。 –

2

在我看來,我會在模型想這一點,因爲我會考慮創建用戶方法的這種假定的過程,而不是與用戶發出請求任何特定的相互作用。

換句話說,因爲我總是希望這封郵件發送,無論請求的來源,我將確定這爲創建用戶操作的天然副產品,類似於記錄被保存在數據庫中。

相關問題