【问题标题】:MVC, what is best practice to fill my presentation model?MVC,填充我的演示模型的最佳实践是什么?
【发布时间】:2014-06-22 22:17:48
【问题描述】:

我已经看过了:

http://r.je/mvc-in-php.html

据此,我将有以下基本代码:

//Instance of a Model
$model = new Model();

//Controller and View get the Model
$controller = new Controller($model);
$view = new View($model);

//Controller change/work with the Model
$controller->doSomeAction();

//Display the final Model
$view->display();

我已经在领域驱动设计中实现了我的应用程序。但是现在我被困在了预置层,我想在经典 MVC 中实现它。

目前,我的控制器会创建模型和视图的实例(上面的代码似乎有问题):

//Get Model
$model = $myRepository->findById(42);

//Do Some stuff
$model->foo = 'foo';
$model->bar = 'bar';

//View
$view = new MyView($model)
$view->render();

Id 42 来自请求。但是我如何根据第一个真正的 MVC 代码来传输它呢?我的意思是,我没有静态模型,模型是由请求动态的。

这样的事情感觉不对,因为模型知道请求:

class MyPresentationModel extends PresentationModel {
    public $foo;
    public $bar;

    public function __construct($request) {
        //init myRepo...
        $obj = $myRepo->findById($request->get(42));
        $this->foo = $obj->getFoo();
        $this->bar= $obj->getBar();
    }
}

那么填充我的演示模型的最佳做法是什么?

【问题讨论】:

    标签: php design-patterns model-view-controller model presentation


    【解决方案1】:

    完全披露:我是那篇文章的作者并被定向到这里,因为这个 URL 在分析中作为引荐来源出现......因此回复晚了!

    这是一个关注点分离问题。关于请求对象应该知道什么?如果您问“请求对象包含什么?”,答案很简单。好吧,“42”是用户选择以查看有关具有该 ID 的记录的一些信息,因此它本质上是一个用户操作“我想查看记录 42”。

    因此,控制器应该可以访问请求对象:

    class Controller {
        private $request, $model;
    
        public function ___construct(Model $model, Request $request) {
            $this->request = $request;
            $this->model = $model;
        }
    
        public function viewAction() {
            $this->model->load($this->request->id);
        }
    }
    

    模型可以是动态的并且基于请求,但选择模型是路由器的工作,而不是控制器的工作。这样做的原因是灵活性,您可以拥有一个从数据库加载记录的模型,或者具有从 CSV 文件或 Web 服务加载记录的相同 API 的模型,如果您构建,所有这三个模型都是可互换的控制器中的模型这意味着您需要为每个模型选项设置一个控制器,由于重复代码而导致混乱。

    视图也是如此。您可以有一个以 HTML 格式显示输出的视图和以 JSON 格式显示记录的另一个视图,以 RSS 提要和 PDF 格式显示记录的视图。但是它们都使用相同的控制器和模型。

    将这一切联系在一起显示了 MVC 的灵活性。与类:

    HTML 视图 PDF查看 RSS查看

    控制器

    数据库模型 CSV模型 网络服务模型

    您有无数种可能的选择:

    • 从数据库中获取数据并将其显示为 HTML
    • 从数据库中获取数据并将其显示为 PDF
    • 从数据库中获取数据并将其显示为 RSS
    • 从 CSV 获取数据并将其显示为 HTML
    • 从 CSV 获取数据并将其显示为 PDF
    • 从 CSV 获取数据并将其显示为 RSS
    • 从 Web 服务获取数据并将其显示为 HTML
    • 从 Web 服务获取数据并将其显示为 PDF
    • 从 Web 服务获取数据并将其显示为 RSS

    始终使用相同的可重用类集。这就是 MVC 的美妙之处,以及组件是独立实体的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 2016-02-27
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多