【问题标题】:Implementing MVP in Web Applications在 Web 应用程序中实现 MVP
【发布时间】:2011-12-31 16:00:02
【问题描述】:

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

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

  1. PHP 脚本设置自动加载器和路由器。对我来说,这意味着任何存在的视图都会向服务器发送某种事件。
  2. 然后路由器根据请求确定应该使用哪个演示者。
  3. 这里是龙。 Presenter 充当 View 和 Model 之间的桥梁,应该将 View 和 Model 作为依赖项,以便可以轻松地对其进行测试。这意味着我需要知道在创建演示者之前我应该​​使用什么模型和视图。

presenter 似乎是知道它需要什么 Model 和什么 View 的类,那么我怎样才能将这个逻辑移出 Presenter?我知道要使用的通用模式是工厂,但在这种情况下我似乎无法理解如何实现它。

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

【问题讨论】:

    标签: php mvp


    【解决方案1】:

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

    假设您有一个如下所示的 URL: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 并根据您的选择进行输出。

    您似乎已经知道这些东西是如何工作的,这就是为什么我对您的问题感到困惑。这能澄清什么吗?

    【讨论】:

      【解决方案2】:

      我发现从状态和状态转换的角度来考虑 Web 应用程序很有用。应用程序处于特定状态,它“位于”视图中,一些 HTML 在关联的 Presenter 的帮助下从模型中的数据呈现到浏览器。用户采取了行动,这将使我们的应用程序进入一个新状态。因此,我们正在从一对 View/Presenter 移动到另一对。在我看来,模型是一个寿命更长、不断发展的东西,我认为我们不会为每次转换都获得一个新模型。

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

      PresenterA 收到一些事件,执行一些可能导致模型更改的工作,然后决定转到哪个视图,比如 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);
      

      与工厂合作,处理视图和模型信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2010-10-16
        • 1970-01-01
        相关资源
        最近更新 更多