2011-05-09 53 views
2

我正在使用數據映射器/網關設計模式。Zend Mail - 在哪裏實例化它?

所以我有:

Mapper; 網關;域對象(主要是getter和setter); 控制器; 一個視圖。

我的問題是:我應該在哪裏實例化Zend Mail? 我認爲這個觀點顯然沒有問題,而且網關也不被考慮。

控制器應該保持清潔,所以:

映射我們的域對象?

如果我們的表單將有一些選擇框從數據庫中檢索數據,那麼Mapper可能是最適合實例化Zend Mail的地方?

謝謝

+0

我注意到我們還沒有完成它的標準方法。我喜歡這個服務理念,但是,我自然傾向於自己避免服務。我也努力將代碼放在控制器中,而且由於似乎沒有單一的解決方案,所以解決這個問題的最好方法是繼續編碼,看看它是否最適合。我會將你的兩個問題都標記爲有用,但我不能將它們標記爲答案,因爲我沒有找到滿足並完全證明自己的答案。這可能是因爲它真的取決於我們的發送郵件任務的性質。再次,代碼會告訴。謝謝你們倆。 – MEM 2011-05-09 23:46:54

+0

是的,我在控制器(例如@Perfection)中進行郵件發送,或者推送到服務中(比如@Jerry Saravia)。從不在映射器或存儲庫中。 – 2011-05-10 07:45:47

回答

1

我總是保持在我的控制器中發送郵件的代碼。

型號 - 數據庫/商業邏輯

視圖 - HTML /表示層

控制器 - 任何東西的代碼。

2

嗯?和Zend一樣,你可以在引導程序中配置Zend_Mail,或者使用application.ini文件或其他配置文件。這就是我現在配置我的方式。對於開發人員,我會將郵件寫入文件並進行測試,我將通過實際的郵件服務器發送郵件。

我在我調用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); 
} 

我不知道這是否是最好的方式,但這樣我的服務功能 與服務相關的名稱並捕獲整個工作流程,而不是隻是將調用轉發給其他對象的原子操作。

希望這會有所幫助。

+0

但是你需要編寫你的電子郵件莫名其妙嗎?如:「用戶名」,「用戶密碼」並將其發送到電子郵件。這些數據將來自數據源。那是userInfo的一個數組還是一個對象,然後你在「sendWelcomeEmail」裏面分割它的信息呢? – MEM 2011-05-10 09:57:22

+0

嘿,UserInfo只是一個簡單的字符串屬性,就像你說的一個對象。在郵件服務中,我使用Zend_View對象在我的電子郵件模板文件夾中「呈現」.php文件。我將呈現的字符串作爲電子郵件的文本使用。 我創建了用於在MailService中呈現的Zend_View對象,但您也可以從FrontController中將它拉出來。 – 2011-05-10 13:04:14