目前主流的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了。

出处:http://baiyuxiong.iteye.com/blog/833996

论PHP框架设计模式及MVC的缺陷的更多相关文章

  1. mvc设计模式和mvc框架的区别

    Spring中的新名称也太多了吧!IOC/DI/MVC/AOP/DAO/ORM... 对于刚刚接触spring的我来说确实晕了头!可是一但你完全掌握了一个概念,那么它就会死心塌地的为你服务了.这可比女 ...

  2. 读书笔记-常用设计模式之MVC

    1.MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在SmallTalk语言中.MVC模式是一种复合设计模式,由“观察者”(Observ ...

  3. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  4. python的设计模式之MVC模式

    模型-视图-控制器模式 关注点分离(Separation of Concerns,SoC)原则是软件工程相关的设计原则之一.SoC原则背后的思想是将一个应用切分成不同的部分,每个部分解决一个单独的关注 ...

  5. 通过Struts2Web应用框架深入理解MVC

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet. 一.用法简介: 1.Eclipse新建Dynamic Web Project, 项目名:Struts2Pro ...

  6. UWP开发之Mvvmlight实践二:Mvvmlight的核心框架MVVM与MVC、MVP的区别(图文详解)

    最近UWP开发在海外很潮流,随着微软收购Xamarin,我们这些C#程序员也可以靠这杆小米枪挑战Android,IOS平台了. 那我们为什么选择MVVM做UWP开发?MVC,MVP,MVVM他们之间到 ...

  7. MVC 插件化框架支持原生MVC的Area和路由特性

    .NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...

  8. 转 分享我在阿里工作十年接触过Java框架设计模式

    转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...

  9. python 设计模式之MVC模式

    一.简单介绍 mvc模式  the  model-view-controller pattern mvc模式是一个运用在软件工程中的设计模式.mvc模式脱离了以前简单的web服务设计逻辑,将开发,测试 ...

随机推荐

  1. Java开发笔记(七十二)Java8新增的流式处理

    通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...

  2. 【eclipse】eclipse报错:the resource is not on the build path of a java project

    最近在eclipse中,使用svn导入svn上的一个maven项目,但是导入后类的包并没有以源码包的方式显示,而是以普通文件包的方式显示出来,在对类进行F3等操作时就报错:“the resource ...

  3. JavaScript字符串转数字的5种方法及其陷阱

    摘要 :JavaScript 是一个神奇的语言,字符串转数字有 5 种方法,各有各的坑法! String 转换为 Number 有很多种方式,我可以想到的有 5 种! parseInt(num); / ...

  4. jsp基础语言-jsp声明

    jsp声明的语法格式:<%! 声明代码 %> jsp声明的意义:用来定义在程序中使用到的变量.方法等.最后要以“:”结尾. jsp声明举例: <%! int a=100,b=200; ...

  5. Django 笔记分享

    Django是一个基于MVC构造的框架.但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model).模板(Template)和视图(Views), ...

  6. 后端开发者的Vue学习之路(三)

    目录 上节内容回顾 组件 什么是组件 组件注册 全局注册组件 局部注册组件 使用细节 组件注册的命名规范: 组件中只有一个根元素 组件也是一个实例 组件在某些元素中渲染出错 组件间的数据传递 父子组件 ...

  7. angular打包后路由和文件路径不对

    base href换成如下script标签 <!-- <base href="/"> --> <script> document.write(' ...

  8. arcgis api 3.x for js 入门开发系列三地图工具栏(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. 你真的了解PeopleSoft中的function和method方法嘛

    谈下function和method在内嵌与外部传参的区别 1.内嵌函数(Internal Functions) 看下现在输出&x的话会返回什么值? 2.内嵌函数(Internal Functi ...

  10. Easyui 实现点击不同树节点打开不同tab页展示不同datagrid表数据设计

    实现点击不同树节点打开不同tab页展示不同datagrid表数据设计 by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3 需求描述 如上图, 1.点击左侧树,叶子 ...