MVC、クラスはどこに行きますか?
-
02-07-2019 - |
質問
MVCについての私の理解は次のとおりです(恐ろしく間違っている場合、私はやっぱり初めてです)
- モデルとは、データベースとインターフェイスするものです
- ビューはページのデザイン/レイアウトです
- コントローラはすべてが始まる場所であり、本質的にページロジックです
CodeIgniter を使用していますが、それだけに限らず、場合によってはPHPフレームワーク。
グローバルクラスはどこに配置しますか
製品のモデルがある場合、データベースから20個の製品を収集するクエリを実行します。今20個のモデルを作るのですか、それとも別のクラスが必要ですか?後者の場合、このクラスをどこに置くのですか(他のコントローラーも使用する必要があります)
解決
モデルは、製品で何をすべきかを議論するときに使用する間違った言葉です。各製品は valueオブジェクト(VO)(または口に合うものであれば何でもデータ転送オブジェクト/ DTO)です。通常、値オブジェクトには、テーブルに含まれるフィールドと同じフィールドがあります。あなたの場合、ProductVOにはProductsテーブルにあるフィールドが必要です。
モデルは、データアクセスオブジェクト(DAO)で、
のようなメソッドがありますfindByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.
あなたの場合、上記のメソッドのようなものを持つProductDAOがあります。このProductDAOは、ProductVOとそれらのコレクションを返します。
データアクセスオブジェクトは、複数のVOおよびビジネスケース固有の追加メソッドを含む可能性のあるビジネスオブジェクト(BO)を返すこともできます。
補遺: コントローラーでProductDAOを呼び出して、必要な製品を見つけます。 返されたProductVOは、ビューに渡されます(Javaのリクエスト属性として)。ビューは、productVOのデータをループ/表示します。
他のヒント
モデルは、ビジネスロジックが発生するアプリケーションの一部です。モデルは、次のようなオブジェクト間の実生活の関係と依存関係を表します。従業員はマネージャーに報告し、マネージャーは多くの従業員を監督し、マネージャーはタスクを従業員に割り当てることができます。モデルCANおよびほとんどの場合DOはデータベースとインターフェイスしますが、これは要件ではありません。
表示は、基本的に表示できる、または表示に役立つすべてのものです。ビューには、テンプレート、テンプレートオブジェクトが含まれ、テンプレートの構成とネストを処理し、ヘッダーとフッターでラップし、よく知られている形式(X / HTMLだけでなくXML、RSS / Atom、CSV)で出力を生成します。
Controller は、ユーザーアクションをモデル操作に変換する変換レイヤーです。言い換えれば、何をすべきかをモデルに伝え、応答を返します。コントローラーメソッドは可能な限り小さく、すべてのビジネス処理はモデルで実行し、ビューロジック処理はビューで実行する必要があります。
さて、質問に戻ります。製品ごとに個別のクラスが必要かどうかは本当に異なります。ほとんどの場合、1つのクラスで十分であり、20個のインスタンスを作成する必要があります。製品はビジネスロジックを表すため、アプリケーションのモデル部分に属する必要があります。
最も簡単な方法は次のとおりです。
- データベーステーブルごとにモデルクラスを用意します。この場合、すべての製品の詳細を保持するオブジェクトになります。
- これらのクラスをパッケージ/ネームスペース、たとえばcom.company.model(Java / C#)に入れます
- DAOクラスをcom.company.model.daoのようなパッケージに入れます
- ビューはセッション/リクエスト/コントローラーからのデータを消費しますこの場合、リスト<!> lt; Product <!> gt;があります。
- ああ、PHPを使用しています。 Dunnoはそれが物事をどのように変えるかを示していますが、現代の言語のようなコレクションフレームワークがあると思います。
@Alexanderは、CakePHPの Behaviors 、 Components 、および Helpers に言及しています。これらは、一般的な機能を抽象化するのに優れています。もちろん、ビジネスロジックの大部分がモデルに含まれているため、ビヘイビアは特に役立ちます。現在、次のような動作があるプロジェクトに取り組んでいます:
- ロック可能
- 公開可能
- タグ付け可能
- 評価可能
- コメント可能
etc。
MVCフレームワークをも超えるコード、つまり、使用している特定のフレームワークに関連付けられていないさまざまな用途に使用するコードライブラリ-私たちの場合、ビデオエンコーディングクラスなど。CakePHPにはベンダーがありますフォルダ。
CakePHPと事実上関係のないものはすべてそこにあります。
CodeIgniterの構造はそれほど柔軟ではなく、CakePHPよりも小さく軽量ですが、 CakePHPマニュアルを参照して、ビヘイビア、コンポーネント、ヘルパー、およびVendorsフォルダがどのように役立つかを確認してください。
モデルのいくつかの一般的なヘルパークラスを含めることは簡単です。乾燥