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