6

私のMVCの理解は次のとおりです(ひどく間違っている場合は、結局私はMVCに慣れていません)

  1. モデルはデータベースとインターフェースするものです
  2. ビューはページのデザイン/レイアウトです
  3. コントローラーはすべてが始まる場所であり、本質的にページロジックです

私はCodeIgniterを使用していますが、それがそれだけに限定されているのではなく、おそらくPHPフレームワークだけに限定されているのではないかと推測するのは危険です。

グローバルクラスはどこに配置しますか?

製品のモデルがあるかもしれません。次に、データベースから20個の製品を収集するクエリを実行します。今、20のモデルを作成しますか、それとも別のクラスを作成する必要がありますか?後者の場合、このクラスをどこに配置しますか(他のコントローラーも使用する必要があります)

4

5 に答える 5

4

製品をどうするかを議論するときにモデルという言葉を使うのは間違っています。各製品は価値オブジェクト (VO) (またはデータ転送オブジェクト/DTO、口に合うものなら何でも) です。通常、値オブジェクトには、テーブルに含まれるフィールドと同じフィールドがあります。あなたの場合、ProductVOにはProductsテーブルにあるフィールドが必要です。

モデルは、次のようなメソッドを持つデータ アクセス オブジェクト (DAO)です。

findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.

あなたの場合、上記のメソッドのようなものを持つ ProductDAO があります。この ProductDAO は、ProductVO とそのコレクションを返します。

データ アクセス オブジェクトは、ビジネス オブジェクト (BO) を返すこともできます。ビジネス オブジェクト (BO)には、複数の VO とビジネス ケース固有の追加メソッドが含まれる場合があります。

補遺: コントローラーで ProductDAO を呼び出して、必要な製品を見つけます。次に、返された ProductVO がビューに渡されます (Java の要求属性として)。その後、ビューは productVO からのデータをループ/表示します。

于 2008-09-26T10:08:51.133 に答える
3

モデルは、ビジネス ロジックが発生するアプリケーションの一部です。モデルは、オブジェクト間の実際の関係と依存関係を表します。たとえば、従業員はマネージャーに報告し、マネージャーは多くの従業員を監督し、マネージャーはタスクを従業員に割り当てることができ、タスクは期限が切れたときに通知を送信します。CAN をモデル化し、ほとんどの場合、データベースとの DO インターフェイスをモデル化しますが、これは必須ではありません。

ビューとは基本的に、表示できるもの、または表示に役立つものすべてです。ビューには、テンプレート、テンプレート オブジェクトが含まれ、テンプレートの構成とネストを処理し、ヘッダーとフッターでラップし、よく知られた形式 (X/HTML だけでなく、XML、RSS/Atom、CSV) のいずれかで出力を生成します。

コントローラーは、ユーザー アクションをモデル操作に変換する変換レイヤーです。つまり、モデルに何をすべきかを伝え、応答を返します。コントローラー メソッドはできるだけ小さくする必要があり、すべてのビジネス処理はモデルで実行し、ビュー ロジックの処理はビューで実行する必要があります。

さて、あなたの質問に戻ります。製品ごとに個別のクラスが必要かどうかは、本当に異なります。ほとんどの場合、1 つのクラスで十分であり、そのインスタンスを 20 個作成する必要があります。製品はビジネス ロジックを表すため、アプリケーションのモデル部分に属している必要があります。

于 2008-09-26T10:08:54.363 に答える
1

CakePHPには、さらに3つの「パーツ」があります。

  1. 行動
  2. コンポーネント
  3. ヘルパー

多くのモデルで使用されるロジックは、動作として作成する必要があります。CodeIgniterにこのロジックがあるかどうかはわかりませんが、ない場合は、そのように実装しようとします。ここで動作について読むことができます。

(コンポーネントはコントローラーがロジックを共有するのに役立ち、ヘルパーは同じ方法でビューを支援します)。

于 2008-09-26T09:53:59.267 に答える
1

最も簡単な方法は次のとおりです。

  1. データベース テーブルごとにモデル クラスを用意します。この場合、すべての製品の詳細を保持するオブジェクトになります。
  2. これらのクラスをパッケージ/名前空間に入れます。たとえば、com.company.model (Java / C#)
  3. DAO クラスを com.company.model.dao のようなパッケージに入れます。
  4. あなたのビューは、セッション/リクエスト/コントローラーからのデータを消費します。この場合、List<Product> があります。
  5. ああ、あなたはPHPを使用しています。それがどのように変化するかはわかりませんが、現代の言語のようにコレクションのフレームワークがあると思います。
于 2008-09-26T11:05:44.617 に答える
1

@Alexander は、CakePHPs BehaviorsComponents、およびHelpersについて言及しています。これらは、一般的な機能を抽象化するのに優れています。もちろん、ビジネスロジックの大部分はモデルで実行されるため、ビヘイビアは特に便利です。私は現在、次のような動作をするプロジェクトに取り組んでいます。

  • ロック可能
  • 公開可能
  • タグ付け可能
  • 評価可能
  • コメント可能

MVC フレームワークを超えるコード、つまり、使用している特定のフレームワークに結び付けられていないさまざまなものに使用するコード ライブラリ - この場合は、ビデオ エンコーディング クラスなどです。CakePHP にはvendorsフォルダがあります。

CakePHP と実質的に関係のないものはすべてそこに入ります。

CodeIgniter の構造はそれほど柔軟ではなく、CakePHP よりも小さくて軽いのではないかと思いますが、CakePHP マニュアルをざっと見て、Behaviors、Components、Helpers、および Vendors フォルダーがどのように役立つかを確認してください。

モデルからいくつかの一般的なヘルパー クラスをインクルードするだけで、Nice とDRYを保つのは簡単なことです。

于 2008-09-26T12:30:22.953 に答える