0

私はショッピング カート サイトを持っています。購入が成功したら、注文のすべての製品の詳細を添付ファイルとしてメールで送信する必要があります。私はファット モデル スキニー コントローラー アプローチを使用しており、すべての関数はモデル内にあります。ビューと一緒に注文IDを渡すことで注文の詳細を提供するコントローラーアクションがあります。dompdf を使用すると、この html を pdf に変換してファイルを作成できます。したがって、添付ファイルを作成するために、いくつかのパラメーターを渡すことで同じ関数を使用できます。私のメール送信コードはモデルです。ここからコントローラー アクションを呼び出し、作成したばかりの pdf ファイル名を取得する必要があります。モデルからコントローラーアクションを呼び出すことは、MVC アーキテクチャに反することを知っています。しかし、どうすればこの機能を実現できますか?

4

2 に答える 2

2

「太い」モデルは良いことですが、 Modelにあってはならないものを Model に入れないようにしてください。MVC では、モデルはdataに関連するすべてのものを処理する必要があります。

太ったモデル

「ファット」モデルのコンセプトは、データ関連のコードをモデルに移動することで、コントローラーのコード量を削減することです。例えば:

これの代わりに; (あなたのコントローラーで):

public function view($id)
{
    $this->request->data = $this->SomeModel->find('first', array(
        'fields' => array(
            // list of fields to retrieve
        ),
        'conditions' => array(
            // conditions
        ),
        // etc.
    ); 
}

検索命令をモデル内のメソッドに移動し、これを使用します。

public function view($id)
{
    $this->request->data = $this->SomeModel->someMethod($id);
}

コードを配置するその他の場所

data に関連しないコードは、コントローラーの外に移動することもできます (「スキニー」にするため)。CakePHP は、コンポーネント内など、コードを移動するための他の場所を提供します

次に、コントローラー内で;

これ:

public function view($id)
{
    $this->request->data = $this->SomeModel->someMethod($id);

    // use functionality of a component
    $this->SomeComponent->doSomething();
}

イベントによる機能のトリガー

コードとロジックをコントローラーの外に置くために、CakePHP 2.x は「イベント」システムを提供するようになりました。これにより、特定のイベントが発生した場合にコードを実行できます。イベントを通じて追加情報を渡すことができます (イベントは、アプリケーションを通過する「通信チャネル」になります)。

特定のイベントに関する電子メールの送信はその良い例です。CakePHP は、CakePHP のイベント システムを説明するためにメールの送信も使用します。これはおそらくあなたが探しているものです:

イベントのディスパッチ - 電子メールの送信

于 2013-03-29T17:46:17.483 に答える
1

モデルメソッドがデータを返すようにして、コントローラーにデータを保持し、pdf関連データとともに他のモデル関数に渡します。

于 2013-03-29T16:14:53.623 に答える