在Web应用程序中实现MVP

时间:2011-12-31 07:23:23

标签: php mvp

据我了解,MVP是MVC的衍生产品,其中Model和View松散或完全分离,Presenter取代了Controller,充当了View和Model之间的桥梁。这种模式似乎比Web应用程序中的传统MVC更合适(无论是否真的不是这个问题的主题,所以请不要走向那个方向)

我的问题在于使用被动视图在PHP中实现各种MVP。这是我目前的流程:

  1. PHP脚本设置自动加载器和路由器。对我而言,这意味着无论存在什么视图,都会向服务器发送某种事件。
  2. 路由器然后根据请求确定应该使用哪个演示者。
  3. 这里是龙。 Presenter充当View和Model之间的桥梁,应该将View和Model作为依赖关系,以便轻松测试。这意味着我需要知道在创建演示者之前我应该​​使用哪种模型和视图。
  4. 演示者似乎是知道什么模型和它需要什么视图的类,那么如何才能将该逻辑从演示者中移出?我知道要使用的通用模式是工厂,我似乎无法理解在这种情况下如何实现它。

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

2 个答案:

答案 0 :(得分:0)

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

假设您的网址如下:http://www.example.com/test/view/1

加载Test控制器是相当标准的,调用方法view将参数1传递给它。所以我们假设你有:

  • TestController.php
  • TestModel.php
  • test.php(查看)

当TestController加载时,它包含模型TestModel,你的“数据内容”在哪里(我想你明白了)。因此,对于此示例,假设view想要从ID为1的用户加载最后5个帖子。所以在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并输出它,但是您可以选择。

看起来你已经知道这些东西是如何工作的,这就是为什么我对你所问的问题感到困惑。这会清除什么吗?

答案 1 :(得分:0)

我发现在状态和状态转换方面考虑Web Apps很有用。应用程序处于特定状态,它在“视图”中,某些HTML在模型中的数据的帮助下与相关的Presenter一起呈现并呈现给浏览器。用户采取行动,这将把我们的应用程序移动到一个新状态。所以我们从一个View / Presenter对转移到另一个。在我看来,模型是一个更长寿,不断发展的事情,我没有看到我们为每个过渡获得一个新的模型。

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

PresenterA收到一些事件,执行一些可能导致模型更改的工作,然后决定转到哪个View,比如说ViewB。 ViewB可以创建其Presenter。根据维基百科的例子(不是PHP我意识到,但原则很明确):

 public class DomainView: IDomainView
 {
     private IDomainPresenter domainPresenter;

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

实际上,Presenter是下一个View / Presenter对的创建者。如果你有更复杂的逻辑,则替换显式构造函数

 new ConcreteDomainPresenter(this);

与工厂合作,使用查看和模型信息。