spi*_*tus 10 php model-view-controller
我正在努力学习并完全理解mvc模式并同时学习php.我决定构建基本的mvc框架,我可以在以后的各个项目中使用它.在这里阅读了很多关于mvc和模型/视图/控制器之间的耦合的帖子我有点迷失.目前我的理解是在Web应用程序控制器中处理来自浏览器的即将发出的请求,并且如果需要,调用方法模型类告诉模型改变其状态.然后控制器实例化将负责显示接口的适当视图类.这是我不明白的一点......
现在应该让控制器传递适当的模型对象来查看和查看应该在需要时从模型中提取所有数据吗?
或者控制器应该从模型中获取数据并将其传递给视图,可能将它全部包装到单个包装器对象中,视图将从那里访问并从中获取数据?
或者视图应该在需要时简单地实例化适当的模型并直接从模型对象中提取数据?
从我在这里读到的
http://www.phpwact.org/pattern/model_view_controller
我倾向于第三个选项,其中控制器不传递任何东西来查看和查看它需要的实例化模型.这是因为:
视图和控制器应具有相同的模型访问权限
控制器不应仅仅作为视图和模型之间的中介.
真的有一种正确的方法可以做到这一点,还是取决于项目?对于对OOP有深刻理解但对php相对较新且对mvc架构不太清楚的人,你会推荐什么方法.或者也许我应该选择对我来说似乎正确的东西并从我的错误中吸取教训(尽管我想避免这个错误;)?
现在,请让我知道,如果我的问题不明确将尝试更好地解释然后..我也读了很多关于stackoverflow的帖子和不同网站上的大量文章,但仍然会感谢帮助,所以提前感谢所有的答案.
Mat*_*ley 14
就个人而言,我一直是#2的支持者.视图不应该关心模型.对于这个问题,该视图根本不应该有任何处理.它应该做它应该做的事情,格式化数据.
因此,控制的基本流程应该是:控制器接收来自浏览器的请求.它处理请求,决定需要哪些数据,并从模型中检索它.然后它将数据传递到视图中,该视图格式化数据并显示它.
作为扩展,用户输入在控制器内部处理,并在需要时保存到模型中,然后反馈被馈送到视图等中.要点的关键是处理在控制器内部发生.
Web MVC和Desktop MVC是两个非常不同的野兽。
在Web MVC中,视图中的链接在Controller上调用方法,该方法将更新模型,然后重定向到适当的View,后者将打开模型并显示其需求。
在桌面MVC中,选项3是错误的,因为视图和模型都应使用相同的引用。在Web中,别无选择。
选项2不是MVC。是MVP,主持人是调解人。
控制器具有对模型的写访问权限;视图仅具有读取访问权限。
这是一个非常有趣的问题。根据我的经验,php 中的大多数实现都会为视图分配一个模型变量:
$this->view->my_property = $modelObj->property
Run Code Online (Sandbox Code Playgroud)
这是常见的做法。对此的常见原因是,如果您发送对象,那么您可以调用从视图中修改对象的方法。
//in the controller file
$this->view->myObject = $modelObj;
//in the view file, you could call an object modifying method
$this->myObject->delete();
Run Code Online (Sandbox Code Playgroud)
从视图修改模型被认为是不好的做法。有些人认为他们不希望他们的设计师能够从视图中调用模型修改方法。
话虽如此。我不同意通常的做法,倾向于将整个对象分配给视图并从那里显示它。并且训练我自己不要在那里进行操作。
第三个选项是将整个对象分配给视图。但是当从视图中调用它们时,对象中的一些如何禁用方法。
就个人而言,我一直是#3的支持者.视图不应该关心控制器.视图不应该对控制器有任何依赖性.它应该做它应该做的事情,展示模型的视图.
因此,控制的基本流程应该是:控制器从浏览器接收请求.它会对模型进行相关的任何更新,然后选择一个视图.然后将控件传递给视图,该视图从模型中获取数据并进行渲染.
作为扩展,用户输入可以被视为模型的一部分,并且控制器和视图都可以从中读取.需要注意的关键点是Controller和View应该没有相互依赖.这就是为什么这种模式被称为MVC.
现在,就个人而言,我发现MVC有点过于繁琐,所以我通常将Controller和View混为一谈.但那不是真正的MVC.
归档时间: |
|
查看次数: |
4165 次 |
最近记录: |