2011-12-31 86 views
2

据我了解,MVP是MVC的衍生物,其中模型和视图是松散或完全解耦,并演示代替了控制器和充当视图和模型之间的桥梁。这种模式似乎比传统的MVC在网络应用(不管这是否是真的不是这个问题的主题,所以请不要沿着那个方向)实现MVP在Web应用程序

我的问题是在执行PHP的各种MVP片,采用被动视图。这里是我目前的事情流程:

  1. PHP脚本设置自动加载器和路由器。对我而言,这意味着无论发生什么样的视图都会向服务器发送某种事件。
  2. 然后,路由器根据请求确定应使用哪个演示者。
  3. 这里是龙。演示者充当视图和模型之间的桥梁,应该将视图和模型视为依赖关系,以便轻松进行测试。这意味着我需要知道创建演示者之前应该使用的模型和视图。

主持人似乎是知道什么模型和它需要什么视图的类,那么我怎样才能将该逻辑移出主讲者?我知道使用的通用模式是一个工厂,我似乎无法理解如何在这种情况下实现它。

也许我这样做是错的。也许我已经编了很长时间的编码,并且正在经历精神扭曲。不管为什么我似乎无法理解如何解决这个问题,我会接受任何指导。

回答

0

不是100%确定我知道你在问什么。你是对的,你根据请求加载适当的控制器。该控制器通常与模型和视图关联。

比方说,你有一个看起来像一个URL:http://www.example.com/test/view/1

这将是相当标准的加载测试控制器,调用该方法view传的说法1。因此,让我们假设你有:

  • TestController.php
  • TestModel.php
  • test.php的(图)

当负载的TestController它包括型号,TestModel,你的“数据材料“(我想你明白这一点)。因此,对于此示例,假设view希望加载来自用户的最后5个帖子,其ID为1。因此,在TestController.php:

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应用程序很有用。该应用程序处于特定状态,它位于View的“at”处,某些HTML是借助相关的Presenter从Model中的数据并呈现给浏览器。用户采取行动,这将把我们的应用程序转移到新的状态。所以我们从一个View/Presenter对移动到另一个。在我看来,模型是一个更长寿的,不断发展的事物,我没有看到我们为每个过渡都获得一个新的模型。

所以你有PresenterA,负责响应ViewA中的事件。

PresenterA收到一些事件,执行一些可能会导致模型更改的工作,然后决定使用哪个ViewB ViewB。 ViewB可以创建其Presenter。按照维基百科的例子(不是PHP我知道,但原则是明确的):

public class DomainView: IDomainView 
{ 
    private IDomainPresenter domainPresenter; 

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

在效果演示是下一个查看/主持人对的创造者。如果你有更复杂的逻辑取代明确的构造函数

new ConcreteDomainPresenter(this); 

与工厂,使用视图和模型信息。