2

Zend Framework の完全な MVC 機能を使用し、サービス レイヤー、ドメイン モデル、およびマッパーを含む Web アプリケーションを作成しています。レイヤーについての私の理解は正しいと思いますが、確認したいと思います。

上のレイヤーは下のレイヤーに依存しているため、上から順に:

  1. コントローラー - 最上位レイヤー。インスタンス化、入力、およびレンダリングするビューに大きく依存します。モデルへのアクセスはサービスに依存します。

  2. 表示 - コントローラを認識していません。場合によっては、サービスまたはモデルに依存します。たとえば、選択コントロールのルックアップ リストを設定する場合などです。

  3. サービス - コントローラーなどのクライアントに API を提供します。モデルに大きく依存します。実際、サービスは、モデルのマッパー部分とドメイン部分の間を仲介して、クライアントのために作業を完了することがよくあります。

  4. マッパー (モデル、パート A) - ドメインについての深い知識があり、ドメイン オブジェクトを操作してリレーショナル データ ストアに適合させ、リレーショナル データを操作して新しいドメイン オブジェクトを作成します。

  5. ドメイン モデル (モデル、パート B) - ドメイン ロジックが含まれています。ドメイン オブジェクトは他のレイヤーを認識しませんが、他のドメイン オブジェクトにアクセスする必要があるため、「オブジェクト ファインダー」としてマッパーにアクセスする場合があります。

それは正しいと思いますか?私は何を逃したのですか?

4

3 に答える 3

3

良い。それはちょっと間違っています -いくつかの詳細で。

MVC には 2 つの主要なレイヤーがあります。

  • モデル層: すべてのドメイン ビジネス ロジック、ルール、および情報を処理します。
  • プレゼンテーション層: インターフェースとインタラクティブ性を扱います

コントローラーは「最上位レイヤー」ではありません。それらはプレゼンテーション層の一部であり、ユーザーの要求を処理し、抽出された情報を渡して (サービスを介して) モデル層の状態を変更し、(はるかにまれに) 現在のビューを変更します。

サービスはモデルの「C部分」です。また、私は「ドメイン モデル」や「モデル オブジェクト」よりも「ドメイン オブジェクト」という名前を好む傾向があります。これは、さらなる混乱を招くからです。

また、ドメイン オブジェクトはデータ マッパーにアクセスしません。ドメイン オブジェクト自体は、それらが保存されているかどうかをまったく認識しない必要があります。その部分はサービスによって処理されます。この回答でコード/APIの例を見つけることができます。

于 2013-03-19T08:30:49.797 に答える
1

基本的に、私はあなたの発言に同意しますが、もう少し深く行きます。

コントローラーは、ビューとモデルの間のメディエーターです。あなたが言ったように、ビューはコントローラーを認識しませんが、モデルも認識しません。

また、モデルでは、前述のように、モデルのエントリポイントとしてサービスレイヤーを使用することも良い点です。

ControllerレイヤーとViewレイヤーがサーバー上にあり、モデルが別のサーバー上にある可能性があることを常に念頭に置く必要があります。したがって、サービスは、ビジネスニーズとビジネスロジックの間のファサードとして機能します。また、トランザクション、エラーの標準化などを処理する場合もあります...実際に物事を横断します。

ドメイン部分については、マッパー部分を2つの異なる部分に分割して拡張します。それはあなたのDALなので、次のクラスを作成することをお勧めします。

  • どこから来たとしても、ドメインオブジェクトをリクエストする
  • 特定の場所からドメインオブジェクトを取得する

つまり、BLがDALにオブジェクトを要求するので、ストレージにオブジェクトを渡すように要求します。ストレージには、レベル1キャッシュ(通常のphp配列)、レベル2キャッシュ(memcached、redis、その他)、そして最後にデータベースなどの一連のレトリバーがあります。したがって、基本的にDALには2つのサブレイヤーがあります。ストアと優先度のスタックを持つストレージクラスと、それらのストアでのフェッチの実装です。

ファクトリのみを使用してレイヤーにステップインすることを忘れないでください。これにより、オブジェクトをモックしてユニットテストを実行したり、各レイヤー間にインターセプターを追加したりすることが容易になります。

よろしく。

于 2013-03-19T06:13:48.847 に答える
0

モデル用の MVC の「M」を忘れました。モデルは、ビュー、レンダリングに必要な情報、またはクライアントに送信する情報を提供します。コントローラーとビューは、モデルを介して情報を交換します。しかし、重要な詳細は、モデルは Domail モデルではないということです

于 2013-03-19T01:16:05.977 に答える