PHP-MVC,什么是填充我的演示模型的最佳实践?

我对此进行了调查:

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();
    }
}

那么,填写演示模型的最佳实践是什么?

解决方法:

完全公开:我是该文章的作者,并被引到了这里,因为该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 feed形式显示,另一个以PDF格式显示.但是它们都使用相同的控制器和模型.

将所有这些链接在一起显示了MVC的灵活性.与类:

HTMLView
PDF浏览
RSS查看

控制者

数据库模型
CSV模型
Web服务模型

您有许多选择:

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

始终使用相同的可重用类集.这就是MVC的优点,也是为什么组件是单独的实体.

上一篇:通向架构师的道路——漫谈架构与设计文档的写作技巧


下一篇:Sign In With Apple