我对此进行了调查:
根据它,我将具有以下基本代码:
//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的优点,也是为什么组件是单独的实体.