これらのMVC層は正しいですか? -- php フィールド と zend-framework フィールド と model-view-controller フィールド と design-patterns フィールド 関連 問題

Are these MVC layers correct?












2
vote

問題

日本語

ZendフレームワークのフルMVC機能を使用して、サービス層、ドメインモデル、マッパーを含むWebアプリケーションを書いています。私は私のレイヤーの理解が正しいと思いますが、確認したいと思います。

上層は下の層に依存しているので、上から始めて:

  1. コントローラ - 最上層。それはインスタンス化、ポピュレイ、そしてレンダリングを強化します。モデルへのアクセスのためのサービスに依存します。

  2. view - コントローラを知らない。時折サービスやモデル、例えば選択コントロールの検索リストを入力するには。

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

  4. mapper(Model、Part A) - リレーショナルデータストアに収まるようにドメインオブジェクトを操作し、リレーショナルデータを操作してフレッシュドメインオブジェクトを作成するためのドメインオブジェクトを操作します。

    ドメインモデル(モデル、パートB) - ドメインロジックを含みます。ドメインオブジェクトは他のレイヤーを認識していません。ただし、他のドメインオブジェクトにアクセスする必要があるため、マッパーにアクセスすることができます。

  5. その音は正しく聞こえますか?私は何を逃しましたか?

英語

I am writing a web application using the full MVC capabilities of the Zend Framework and including a service layer, domain model and mapper. I think my understanding of the layers is correct but would like to confirm.

The upper layers are dependent on the layers below, so starting from the top:

  1. Controller - the topmost layer. Highly dependent on the View, which it instantiates, populates and renders. Dependent on Services for access to the Model.

  2. View - Unaware of the Controller. Occasionally depends on Services or Model, e.g. to populate lookup lists for a select control.

  3. Services - Provide an API to clients, such as the Controller. Highly dependent on the Model. In fact, Services often mediate between the Mapper- and Domain-parts of the Model to get work done for a client.

  4. Mapper (Model, Part A) - Has an intimate knowledge of the Domain, manipulating Domain objects to fit into a relational data store, and manipulating relational data to create fresh Domain objects.

  5. Domain Model (Model, Part B) - Contains the domain logic. Domain objects are unaware of other layers however since they need access to other domain objects, they may access mappers as 'object finders'.

Does that sound about right? What have I missed?

</div
           

回答リスト

3
 
vote
vote
ベストアンサー
 

ええ。詳細はちょっと間違ったish です。

MVCに2つの一次層があります。

  • モデルレイヤ:それはすべてのドメインビジネスロジック、ルール、および情報
  • を扱います。
  • プレゼンテーション層:インタフェースと対話性を扱う

コントローラはではなく 「最上層」です。それらはプレゼンテーション層の一部であり、それらの責任はユーザーの要求を処理し、抽出された情報を渡してモデルレイヤの状態(サービスを通じて)および現在のビューの状態を変更することです。

私は言うでしょう、 services はモデルの "C部分"です。また、追加の混乱を引き起こすため、「ドメインモデル」または「モデルオブジェクト」を介して「ドメインオブジェクト」という名前を付ける傾向があります。

とドメインオブジェクトはデータマッパーにアクセスしないようにします。ドメインオブジェクト自体は、保存されているかどうかを完全に認識されるべきです。その部分はサービスによって処理されます。 この回答。

の例を見つけることができます。
 

Well. It's kinda wrong-ish in few details.

There are two primary layers in MVC:

  • model layer: that deals with all of the domain business logic, rules and information
  • presentation layer: deals with interface and interactivity

The controllers are not the "topmost layer". They are part of presentation layer, and their responsibility is to handle users' requests and pass the extracted information to alter the state of model layer (through services) and (much rarer) the current view.

I would say, that Services are the the "C part" of Model. Also, I tend to prefer name "domain object" over "domain model" or "model object", because it causes additional confusions.

And the domain objects to not access data mappers. Domain objects themselves should be completely unaware of whether they are stored or not. That part is handled by services. You can find code/api example in this answer.

</div
 
 
   
   
1
 
vote

基本的には、私はあなたの声明に同意しますが、私は少し深く行きます。

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

また、あなたのモデルでは、あなたのモデルのエントリーポイントとしてサービス層を持つことも良い点です。

コントローラとビューレイヤーがサーバー上にある可能性があること、および他のモデルのモデルには必ずしも注意してください。だからあなたのサービスはあなたのビジネスニーズとあなたのビジネスロジックの間のファサードとして機能します。それはまたあなたの取引、誤り標準化などを扱うかもしれません...実際に物事を横断しています。

あなたのドメイン部分には、それを2つの異なる部分に分割してマッパー部分を拡張します。それはあなたのDAL以来、あなたは:

のためのクラスを作成することをお勧めします。
  • 彼らがどこから来たのかどこから来たのかどこからでも要求します。
  • ドメインオブジェクトを特定の場所から取得する

私は、あなたのBLはあなたのDALを要求しているので、あなたにそれをあなたに与えるようにあなたのストレージに頼みます。ストレージには、LEVEL1キャッシュ(通常のPHPアレイ)、Level 2キャッシュ(MemCached、Redis、Every)、最後にデータベースなどのレチリアンのセットがあります。そのため、基本的にDALに2つのサブレイヤーを持っています。ストレージのスタックと優先順位のストレージクラス、およびそれらのストア内の取得の実装があります。

工場を使用してのみあなたのレイヤーに入ることを忘れないでください。そのため、それらの内側のオブジェクトをモックすることによって単体テストを簡単にすることができます。

雑談

 

Basically, I agree with your statements, but I would go a bit deeper.

The controller is your mediator between the View and your Model. So as you said, the View is unaware of the controller, but so is the Model.

Also, in your model, as you mentioned, that's also a good point to have the Service layer as en entry point of your model !

You always have to keep in minde that the Controller and View layers might be on a server, and the model on an other one. So your service acts as a facade between your business need and your business logic. It also may handle your transactions, error standardisation, etc... Transverse things actually.

For your domain part, I would extend your mapper part by dividing it into 2 distinct parts. Since it's your DAL, you may want to create class for :

  • Requesting your domain objects, wherever they come from
  • Retrieving your domain objects, from a specific location

I mean, your BL requests your DAL an object, so you ask your storage to give it to you. The storage has a set of retrievers, such as a level1 cache (regular php array), level2 cache (memcached, redis, anything), and finally your database. So I'd basically have 2 sub layers in the DAL : a storage class with its stack of stores and priorities, and an implementation for the fetch in those stores.

Don't forget to step into your layers only using factories, so that it will be easier to make unit testing by mocking your objects inside them, or add interceptors between each layer.

Regards.

</div
 
 
0
 
vote

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

 

You forgot the 'M' from MVC, that is for Model. Model provides for your View, the information needed to render it, or the information you want to your client submit on it. The Controller and the View trades information via your Model. But an important detail is that Model IS NOT your Domail Model

</div
 
 

関連する質問

2  ドライプリンシパルを満たすためにJavaScriptにURLをリクエストURLを保存しますか?  ( How do you store request urls in javascript to satisfy the dry principal ) 
Ajaxアプリケーションで要求されるエンドポイントのURLを格納するためのJavaScriptに一般的に使用されているパターンはありますか? 例えばURLの範囲を抽象化する「サービス」クラスを作成しますか? ...

1  被験者や観察者を一緒に配線するための依存性注入のようなパターンはありますか?  ( Is there a dependency injection like pattern for wiring together subjects and ob ) 
被験者 - 観察者の関係は依存関係ではありません:オブザーバーはが存在するために被験者が必要としていません。それでも、出版社や加入者の「一緒に配線」は、依存性注入を強く彷彿とさせる。 私のシュート - 'アップゲームはオブザーバーパターンを広く利用します。例...

286  リレーショナルデータベースデザインパターン? [閉まっている]  ( Relational database design patterns ) 
閉鎖。この質問はもっと焦点を絞ったにする必要があります。現在答えを受け付けていません。 この質問を改善したいですか?このPOST...

3  C#のプロトコル抽象化  ( Protocol abstraction in c sharp ) 
何十ものネットワークプロトコルとファイルフォーマット(WAV、TCP、BMPなど)があります プロトコルの実装と結果のデータを使用するコードの間に抽象化レイヤーを作成するために利用可能な解決策はありますか? WAVファイルを取ります。ソフトウェアコンポーネン...

1  多くの種類がある場合は、オブジェクトの種類でサブクラスではありませんか。  ( Should i not subclass by type of object if there are many types ) 
私は、約60の異なる「タイプ」のイベントがあるイベントのログを使って取り組んでいます。各イベントは約10個のプロパティを共有し、次に様々な追加のプロパティを共有するイベントのサブカテゴリがあります。 私がこれらのイベントをどのように動作させるかは、それらのタイ...

2190  MVPとMVCとは何ですか、そして違いは何ですか?  ( What are mvp and mvc and what is the difference ) 
この投稿を改善したいですか?引用やあなたの答えが正しい理由の説明を含むこの質問に対する詳細な回答を提供します。十分な詳細なしの回答を編集または削除することができます。 ...

9  Djangoでは、HTMLフォーマットデータの短いスニペットを入れるのに最適な場所はどこですか?  ( In django where is the best place to put short snippets of html formatted data ) 
この質問は(しかし、おそらく同じではありません): はHTMLヘルパーを持っていますか? 私の問題はこれです:Djangoでは、私は絶えず低レベルのデータベースオブジェクトの基本的なフォーマットを再現しています。これは例です: 私は2つのクラス、人と住所を...

14  サイト全体の単一のindex.phpページを使用するのはなぜですか?  ( Why use a single index php page for entire site ) 
既存のPHPプロジェクトを引き継ぎています。以前の開発者がサイト全体の1つのIndex.phpページを使用していることに気づいた。これは私がこのようにして見た2番目のプロジェクトです。私はこのアプローチの利点を見ません。実際、それはそれがすべてを複雑にするよう...

2  DTOオブジェクト(データ転送オブジェクト)を効果的に使用する方法?  ( How to effectively use dto objects data transfer objects ) 
DTOを実装する最善の方法は何ですか? 私の理解は、それらがオブジェクト間でデータを転送する1つの方法であるということです。たとえば、ASP.NETアプリでは、DTOを使用して、ビジネスロジックレイヤコンポーネントにデータを表示します。 メソッドパラメータと...

6  戦略パターンを使用したJavaの電子機器  ( Emailer in java using strategy pattern ) 
更新:追加の質問を追加しました(質問#4)。 こんにちは、 私は自分自身をカスタムの電子メール効用で構築しています。今、単一の責任の原則に従うために、Mailersender、MailProvider、およびemailObjectのクラスに従います。 Mai...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有