请您先登录,才能继续操作
锁定老帖子 主题:论PHP框架设计模式及MVC的缺陷
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-05
目前主流的PHP框架设计模式均为MVC模式,比如yii或codeigniter,均是由控制器接收页面请求,并沟通模型与视图的交互。如果我们把网站整体看作一个矩阵,把网站接收用户请求并处理看作是网站的竖向,而把网站的每一个模块(比如文章模块,投票模块,论坛模块等)看作是网站的横向。那么我们可以画出这样的图: 模块1 模块2 模块3 用户请求 ---------------------- | | | | | | 数据处理 ---------------------- | | | | | | 页面呈现 ---------------------- MVC的缺陷 MVC模式,侧重于竖向即请求、处理、呈现之间的协调,而忽略了模块之间的协调,从图里我们可以看出,当用户发起请求的时候,由哪个模块来处理用户的请求已经确定了,这就使模块之间呈现非常强的独立性,这该怎么理解呢,举个例子来说。 假设现在,你有两个模块,一个是新闻模块,一个是图片模块,新闻模块展示一些新闻文章,图片模块用来展示图片。 如果用MVC,我们这样实现:定义两个控制器news,pic,两个模型news_model,pic_model,两个视图news_view,pic_view,当有用户请求news控制器时,先调用news_model取得需要的数据,再用这些数据渲染news_view,最后呈现给用户。 有一天,你的领导忽然有了新想法,HEY,伙计,新闻模块只显示新闻太单调,让新闻模块,能显示图片模块里最热门的图片。这下不好办了,new_model里没有图片相关的模型,news_view里也没有显示图片列表的视图。你有解决办法?把显示图片列表相关的模型和视图分别复制一份到news的模型和视图?不,这么做不好,如果我现在全站都要显示热门图片列表你怎么办?还复制吗?不可以的。后期维护会累死人。 在codeigniter框架里,有更好一点儿的解决办法,就是把显示图片列表这个功能做成一个library,每需要的地方,调用library就可以,因为library有与控制器相同的沟通模型视图的功能。但这会带来一个新的问题:数据共享,如果页面分割成不同的library来实现,不同的library的数据很难共享,library之间是完全独立的。 现在来看,这一切的一切都是因为mvc模式注重竖向的沟通,而忽略了横向的沟通,完全割裂了模块之间的关系。 模块沟通 TextPattern(简称TXP)是一个小型的BLOG系统,它最大的特点是注重模块之间的沟通,完全模糊了不同模块间的界限,对与用户的一个请求,TXP完全没必要知道用户请求的是什么模块,新闻还是图片,只需要知道请求的页面要呈现些什么功能点。每一个小功能点都是完全独立的。 这是一种视图驱动的模式,接收到用户请求后,首先取到要请求的视图,视图文件再调用不同的功能点,这样就弱化了模块之间独立性。通俗点儿说:用户想看什么,你就给什么,不要管它是不是同一个模块,是不是有关系。wordpress也是基于视图驱动的模式的。 HMVC 层叠式的MVC,这是MVC模式的升级版本。首先把系统按功能点分,每个功能点的实现再采用MVC模式。HMVC同时兼顾了横向和竖向的沟通。 我所认为理想的模式 基于视图驱动的HMVC,基于视图驱动,就是以用户为基础,呈现用户想看到,以需求为驱动才是正确的。HMVC保证了代码的重用,易于维护。 视图驱动,可以借鉴WORDPRESS的实现,因为wordpress的模板开发、替换很容易;横向沟通的实现可以借鉴TXP;竖向沟通就是典型的MVC了。 一家之言,欢迎拍砖。请勿转载。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-08
你对MVC理解有误,应该是被这些个框架误导了。
|
|
返回顶楼 | |
发表时间:2010-12-08
为什么说有误?
四不象 写道 你对MVC理解有误,应该是被这些个框架误导了。
|
|
返回顶楼 | |
发表时间:2010-12-08
MVC并不是说控制器-视图-模型一一绑定或对应,只不过那些所谓的框架实现成这个样子而已,这不是MVC的缺陷,而是那些框架的缺陷
|
|
返回顶楼 | |
发表时间:2010-12-08
news controller里面无法使用pic model,或者news view里面无法显示pic model的数据,这个是实现得不对,不能算在MVC头上
|
|
返回顶楼 | |
发表时间:2010-12-09
这真的与MVC没有关系,遇到那问题是设计上面的。
你对MVC理解有误,应该是被这些个框架误导了。 |
|
返回顶楼 | |
发表时间:2010-12-09
lz 对 mvc的理解很清晰,不过感觉不能灵活的使用,所以才会碰到这些问题。
利用好逻辑接口,配合view部分的继承关系,view不一定是一个页面,也可以是一个区域。MVC只是一个构架概念,自己的程序能够清晰的分层利于维护就算可以了。 |
|
返回顶楼 | |
发表时间:2010-12-09
没亮点嘛 (字数不够 )
|
|
返回顶楼 | |
发表时间:2010-12-10
smilerain 写道 lz 对 mvc的理解很清晰,不过感觉不能灵活的使用,所以才会碰到这些问题。
利用好逻辑接口,配合view部分的继承关系,view不一定是一个页面,也可以是一个区域。MVC只是一个构架概念,自己的程序能够清晰的分层利于维护就算可以了。 明白了,我的理解太局限于CI这个框架了,因为我用这个框架用的多,把这个框架的缺点理解成MVC的缺点了。 |
|
返回顶楼 | |
发表时间:2010-12-10
baiyuxiong 写道 smilerain 写道 lz 对 mvc的理解很清晰,不过感觉不能灵活的使用,所以才会碰到这些问题。
利用好逻辑接口,配合view部分的继承关系,view不一定是一个页面,也可以是一个区域。MVC只是一个构架概念,自己的程序能够清晰的分层利于维护就算可以了。 明白了,我的理解太局限于CI这个框架了,因为我用这个框架用的多,把这个框架的缺点理解成MVC的缺点了。 yii或codeigniter的帮助和例子里的model层都是实体model,楼主应该是被这个误导了,在控制层完全能够调用自己的类干活 |
|
返回顶楼 | |