2

データマッパー/ゲートウェイのデザインパターンを使用しています。

だから私は持っています:

マッパー; ゲートウェイ; ドメインオブジェクト(主にゲッターとセッターを使用)。コントローラー; ビュー。

私の質問は、ZendMailをどこでインスタンス化する必要があるかということです。この見方は明らかに問題外であり、ゲートウェイも考慮されるべきではないと私は信じています。

コントローラは清潔に保つ必要があるため、次のようになります。

ドメインオブジェクトをマッパーしますか?

フォームにデータベースからデータを取得する選択ボックスがある場合、おそらくMapperがZend Mailをインスタンス化するのに最も適切な場所になりますか?

ありがとう

4

2 に答える 2

2

うーん?Zend では、ブートストラップで、または application.ini ファイルやその他の構成ファイルを使用して、Zend_Mail を構成できます。それが私の今の設定方法です。開発ではメールをファイルに書き込み、テストでは実際のメール サーバーでメールを送信します。

Zend_Mail インスタンスを、Mail_Service と呼ぶクラスでインスタンス化します。このメール サービス クラスは、メールを送信する必要がある場合に 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 );
}

これが最善の方法かどうかはわかりませんが、この方法では、他のオブジェクトへの呼び出しを転送するだけのアトミック操作ではなく、サービスに関連する関数名がサービスにあり、ワークフロー全体をキャプチャします。

お役に立てれば。

于 2011-05-09T21:23:11.860 に答える
1

メールを送信するコードは常にコントローラに保持しています。

モデル - データベース/ビジネス ロジック

表示 - html / プレゼンテーション層

コントローラー - 何かを行うコード。

于 2011-05-09T20:10:51.680 に答える