2011-12-31 3 views
2

MVPはMVCの派生物であり、モデルとビューが緩やかにまたは完全に分離されており、Presenterはコントローラを置き換え、ビューとモデルの間のブリッジとして機能します。このパターンは、ウェブアプリケーションの従来のMVCよりも適切です(これが本当であるかどうかはこの質問の対象ではありませんので、その方向に進むことを控えてください)WebアプリケーションでのMVPの実装

私の問題は、パッシブビューを使用してPHPでさまざまなMVP作品を実装することです。ここに私の現在の流れがあります:

  1. PHPスクリプトは、オートローダとルータを設定します。私にとって、これは、存在していたビューが何らかのイベントをサーバーに送信したことを意味します。
  2. ルータは、要求に基づいてどのプレゼンターを使用すべきかを決定します。
  3. ここは龍です。プレゼンターは、ビューとモデルの間のブリッジとして機能し、簡単にテストできるように、ビューとモデルを依存関係として使用する必要があります。つまり、プレゼンターが作成される前にどのモデルとビューを使用するべきかを知る必要があります。

プレゼンターは、どのモデルとどのビューが必要なのかを知っているクラスのようですが、どのようにプレゼンターからそのロジックを移動できますか?私は、使用するジェネリックパターンが工場であることを理解しています。この場合、実装する方法を理解できていないようです。

おそらく私はこれをすべて間違っていると思います。たぶん私は伸びが長すぎてコーディングしていて、心の歪みを経験しているかもしれません。なぜこの問題を解決するのか理解できないような理由にかかわらず、私はどんな指導も受け入れます。

答えて

0

あなたが何を求めているのかわかりません。要求に基づいて適切なコントローラをロードするのは間違いありません。そのコントローラは、通常、モデルとビューに関連付けられています。

のは、あなたがどのように見えるURLがあるとしましょう:http://www.example.com/test/view/1

テストコントローラをロードするためにかなり標準的だろうが、方法viewパスそれを引数1を呼び出します。それでは、あなたが持っていると仮定してみましょう:

  • TestController.php
  • TestModel.php
  • test.phpを(ビュー)

TestController負荷、それはあなたの "モデル、TestModelを含む場合データのもの "が(私はあなたがそれを理解すると思う)行く。したがって、この例では、viewは、ユーザーID 1の最後の5つの投稿を読み込みたいとします。 TestController.php中のSO:

function view($arg) 
{ 
    $userID = $arg; 
    $posts = $this->model->loadPosts($userID); 
    $this->render('test', $posts); // outputs the HTML in test.php 
} 

そしてtest.phpを中

、あなたが $postsをループして出力、それはしかし、あなたが選択することができます。

あなたはすでにこのような仕組みが分かっているようですが、これは私があなたが求めているものについて混乱している理由です。これで何かがクリアされますか?

0

私は、状態と状態遷移に関してWeb Appsを考えるのが有益であることを発見しました。アプリケーションが特定の状態にあり、ビューにあるとき、モデル内のデータから関連付けられたPresenterの助けを借りて、ブラウザにレンダリングされたHTMLがあります。ユーザーは行動を取って、これは私たちのアプリを新しい状態に移します。そこで、あるView/Presenterのペアから別のペアに移動しています。私の考えでは、モデルはより長く生き続ける、進化するものです。私は、それぞれの変化に対して新しいモデルを得ることはできません。

あなたはViewAのイベントに応答する責任を負うPresenterAを持っています。

PresenterAはイベントを受信し、モデルの変更を行う可能性のある作業を実行し、次にどのビューを表示するかを決定します(たとえば、ViewB)。 ViewBはPresenterを作成できます。ウィキペディアの例のように(私が気付いてPHPが、原理は明らかではありません):

public class DomainView: IDomainView 
{ 
    private IDomainPresenter domainPresenter; 

    public DomainView() // Constructor 
    { 
     this.domainPresenter = new ConcreteDomainPresenter(this); 
    } 
} 

は、実際にはプレゼンターは、次のビュー/プレゼンターペアの作成者です。あなたがより複雑なロジックを持っている場合は、ビューとモデルの情報での作業、工場で明示的なコンストラクタ

new ConcreteDomainPresenter(this); 

を交換してください。

関連する問題