4

私はPHPでMVCで遊んでいます。私はフレームワークを使用していません。パターンを理解しようとしているだけです。

たとえば、このチュートリアルでは、コンストラクターに渡されたモデルとビューでインスタンス化されたコントローラーが表示されることがあります。同じチュートリアルでは、ビュー (ここでは「テンプレート」) クラスがコンストラクターでコントローラーを受け取ります。

だから私の質問は:

  1. ビューがコントローラーへの参照を必要とするのはなぜですか? ビューは、この関係において受動的なパートナーであるべきではありませんか?
  2. コントローラーは特定のモデルへの内部参照を持つべきですか? 別の言い方をすれば、コントローラーのアクションでモデルをインスタンス化して、そのように使用しないのはなぜでしょうか?
4

5 に答える 5

3
  1. ユーザー入力がある場合は、それらをどこに送信するか、どのコントローラーに送信するかを知る必要があります。

  2. コントローラーが「外の世界」にさらされており、攻撃を受けやすいため、コントローラーでモデルを直接操作するのは好きではありません。サービス レイヤー パターン、データ転送オブジェクト パターンなどを見ることができます。コントローラーが使用するサービス API の背後でモデルを分離するのが好きです。パターンに関する優れた本が必要な場合は、Martin Fowler の本を探すことができます :)

于 2012-06-14T09:00:05.360 に答える
1

私の経験では、MVC が正確に何を意味するかについては多くの解釈があります。ほとんどの人は、一般的に次のことに同意します。

  • モデルはビジネス ロジックを実装し、データ アクセスをカプセル化します。
  • ビューはプレゼンテーション ロジックを実装します。
  • コントローラーは、入力と制御フローを処理します。

彼らがどのようにつながり、互いに話し合うかは、議論、議論、拳闘、そして聖戦の問題です.

実際には、コントローラーは通常、ビューとモデルをロードし、ビューはモデルとコントローラーをロードすることもありますが、モデルは通常、コントローラーやビューをロードしません。

ビューがコントローラーをロードするのはなぜですか? 独自のコントローラー、モデル、およびビューを持つウィジェットを実装したとします。このウィジェットを複数の場所の複数のページにロードしたいと考えています。これを行う最も簡単な方法は、ウィジェットのコントローラーをビューにロードすることです。

ビューがモデルをロードするのはなぜですか? 2 つ以上のビューをロードできるようにコントローラーを作成し、非常に異なるビューごとに異なるモデルをロードする必要がないようにしたい場合があります。したがって、各ビューに独自のモデルをロードするように指示するだけです。

役割を分離しますが、必要なシステムを最も効率的かつ論理的に実装する対話を許可します。

于 2012-06-14T14:11:26.753 に答える
1

私はすでにMVC と PHP のコンテキストでモデルについて広範囲に書くことができたので、トライアドの一部に焦点当てViewましょう。Controller

@Gordon既に述べたように、Web で行うことは従来のMVC ではありません。ラリーはできません。代わりに、元のアイデアの明確なバリエーションを考え出しました。

ビューはテンプレートではありません

MVP の特に不適切な実装を使用していない限り、viewインスタンスはオブジェクトであり、プレゼンテーション ロジックを担当します。

controllerインスタンスがアクセスする必要があるかどうかviewは、使用する MVC にヒントを得たパターンによって異なります。MVP および MVVM パターンでcontrollerは、インスタンスが情報を要求し、 (何らかの変更または追加のフラグを使用して)に情報model layerを渡します。view

Model2 パターン (元のコンセプトにより近い) では、viewインスタンス自体が から情報を取得できますmodel layer。この場合、controllerインスタンスにアクセスする必要はありません。

コントローラーは何を担当していますか?

のインスタンスは、controllerから構造体を直接インスタンス化するべきではありませんmodel layer。これには主に 2 つの理由があります。

  • 特定のクラス名への密結合を引き起こし、テストとメンテナンスを困難にします
  • 追加の責任 (または変更の理由) を追加し、したがって - SRPに違反します。

からの構造体の初期化model layerは複雑です。通常、データベース接続、キャッシュ ハンドラ、さらにはその他の構造を から注入する必要がありますmodel layer。このタスクは、コントローラが使用する別のファクトリのようなインスタンス (controllerとインスタンス間で共有) に任せる必要があります。view

controllerインスタンスの主な役割は、 の状態を変更することですmodel layer。ユーザーからの入力を受け取り、それを が理解できる形式に変換する必要がありますmodel layer

model layer全体として、およびインスタンスについて完全に無知でなければならないことに注意してください。viewcontroller

于 2012-06-14T10:12:04.527 に答える
1
  1. ビューはコントローラを参照すべきではありません (もちろんアクション リンク以外)。コントローラーは、指示されたアクションを実行し、結果をビューに送信します。

  2. 私が MVC を使用した限り、アクションでモデルをインスタンス化し、そのように使用します。コントローラーをモデルにバインドするのは好きではありません。通常、リポジトリ構造を使用してモデルにアクセスします。大規模なプロジェクトでは、コントローラーとモデルの間にサービスレイヤーがあります。.net MVC では、コントローラーとアプリの MVC 部分が参照するエンティティとしてビューモデルを使用して遊んでいましたが、サービスはドメイン モデルと関係があるものをすべて処理し、ビューモデルを返します。

于 2012-06-14T09:14:15.970 に答える