1

いくつかの基本的なアプリケーションを CodeIgniter に変換し始めたばかりで、正しい足場から始めることを確認しようとしています。

私のコントローラーのほとんどのアクションには、少なくとも 1 つのクエリが必要です。これについては、2 つの方法があります...

  1. クエリをモデル内の 1 つのメソッドに結合して、コントローラーからモデルへの呼び出しを 1 回だけ行います。

  2. 各クエリをモデル内の独自のメソッドにしてから、コントローラーから各メソッドを順番に呼び出します。

これまでのところ、私は独自のポリシーを採用していますが、それが推奨されているのか、MVC パターンを破っているのかはわかりません。

クエリが互いに直接関連しており、順番に一緒にのみ実行される場合 (2 番目のクエリは最初の実行が成功したことに依存します)、または1 番目のクエリのデータが 2 番目のクエリに渡され、実際のクエリを返すのは 2 番目のクエリです。結果セットを表示し、#1を使用します

各クエリが表示用に個別の結果セットを返す場合は、#2を使用します。

このシナリオでロジックを構造化して分離するための推奨される方法はありますか?
私が最後にやりたいことは、後で自分自身に悪夢を引き起こすことです. 私の本能は、できるだけ多くのロジックをコントローラーに入れるべきだと言っています。

4

2 に答える 2

1

特定の一連のクエリが一緒にのみ実行される場合、それらはモデル内の同じメソッドに属している必要があるという点で、あなたの考えは正しいです。独立したクエリは独自のメソッドにする必要があります。これにより、必要に応じてコントローラーから呼び出すことができます。

複数のクエリを組み合わせるには、次のようにコントローラーから複数の呼び出しを行うことができます。

$this->your_model->doQuery1();
$this->your_model->doQuery2();
$this->your_model->doQuery3();

または (これは私が行うことです)、これら 3 つのクエリを実行するモデルでラッパー メソッドを作成します。

だからあなたはすることができます

$this->your_model->runQueries();

どこ

function runQueries() {
  $this->doQuery1();
  $this->doQuery2();
  $this->doQuery3(); 
}

これにより、後で変更するのがより柔軟になります。

最後に、「可能な限り多くのロジックをコントローラーに配置する必要がある」というあなたの声明については、これは実際にはskinny controller, fat model、一部の人々が購読しているという学校に反します。他の学派と同様に、これは決まったものではありません。

于 2012-10-01T23:08:56.967 に答える
1

まず第一に、アプリケーションの終了時にフレームワークを平手打ちする - 常に悪い選択です。フレームワークはアプリケーションを改善しません。それらは、開発を迅速化するために存在します。

また、CodeIgniter は実際には適切な MVC を実装していないことを理解する必要があります。代わりに、Rails アーキテクチャと命名規則を模倣しています。実際にはMVPパターンに近いです。


いずれにせよ、コントローラーは可能な限り軽量でなければなりません

適切な MVC または MVC にインスパイアされたパターンを実装する場合、すべてのドメイン ビジネス ロジックはモデル レイヤーにあり、すべてのプレゼンテーション ロジックはビューにあります。コントローラーは、関連するデータのみをモデルレイヤーと現在のビューに渡します。

CodeIgniter のコードを記述するときは、「モデル」にできるだけ多くのドメイン ロジックを保持し、ビュー ヘルパーにほとんどのプレゼンテーション ロジックを保持する必要があります。

CodeIgniter で「モデル」と呼ばれるものは、ほとんどがドメイン オブジェクトであり、アクティブ レコードパターンを実装するためにストレージ ロジック ( SRPに違反) とマージされることがあります。

最良の選択肢は、サービスとして機能し、コントローラーを CodeIgniter の「モデル」との直接の対話から分離する、より高いレベルの「モデル」を作成することです。

説明した状況では、異なる「モデル」に2つのリクエストを行う必要がありますが、この操作はそのようなサービスで行われます。そして、サービスは両方の「モデル」からのデータを集約し、コントローラーに渡します。


たとえば、新しいユーザーを登録する場合、ストレージ (通常はデータベース) にアカウントのエントリを作成し、ユーザー通知を電子メールで送信するという 2 つの操作を実行する必要があります。これらの両方の操作は、ユーザー管理を担当するサービスに含めることができます。

コントローラーは、サービスに新しいアカウントを作成するように要求するだけです。サービスが複数の操作を実行するという事実 ( User「モデル」を初期化し、それにデータを割り当て、保存し、成功するMailerと電子メールを開始して送信する) は、コントローラーにはまったく関係ありません。コントローラーは、エラーのリストのみを知りたいと考えます (リストが空の場合、すべて問題ありません)。

..私の 2 セント

于 2012-10-02T01:19:18.803 に答える