我看过这个:
根据它,我将拥有以下基本代码:
//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();
我已经在域驱动设计中实现了我的应用程序。但现在我陷入了presenetation层,我想在经典的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();
}
}
那么填写演示模型的最佳做法是什么?
答案 0 :(得分:4)
完全披露:我是该文章的作者并在此处获得指导,因为此网址作为分析中的参考者出现....因此迟到的回复!
这是一个关注点分离的问题。应该了解有关请求对象的内容?如果您询问“请求对象包含什么内容?”,答案很简单。好吧,“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的灵活性。上课:
HTMLView PDFView RSSView
控制器
DatabaseModel CSVModel WebServiceModel
您有很多可能的选择:
一直使用相同的可重用类集。这是MVC的优点,也是组件为独立实体的原因。