如何理解MVC
OrangeThinK 2019年04月05日 •  0
本文最后修改于 300 天前,部分内容可能已经过时!

什么是MVC

M是指业务模型(Model),V是指用户界面(View),C则是控制器(Control).

控制器简单理解就是前台,视图简单理解就是环境布局,模型简单理解就是专业师傅

简单的工作,前台就可以自己直接完成

复杂的工作就需要前台(控制器)去通知专业人士(模型)做,只起到一个路由通知的作用

所以何时是否需要使用模型,取决于规模的复杂度,如果只是简单开发,那直接写到控制器即可

使用MVC的目的

使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式

比如一批统计数据可以分别用柱状图、饼图来表示

比如HTML+CSS分离网站样式

比如你电脑文件的查看方式为“列表”,“图标”,“详细”

C存在的目的则是确保M和V的同步,一旦M改变(发出信号),V应该同步更新(响应刷新)。

可能你还不能太理解,没有关系,不要困在这里,见树不见林,接着往下读接着钻研,你就会慢慢发现融会贯通了理解了

MVC历史

部分参考文献:MVC历史2016年06月03日

早在 MVC 出现以前,程序员是将 html、css、js、php、SQL 写在一个 .php 文件内的,那时的网页非常简单

后来复杂了,需要多个人协同开发,一个开发后台,专写 php + SQL,一个开发前端,专写 html + css + js形成了 VC架构,但有个问题,他们之间不是异步开发的,而是同步开发,前端写完模板,phper 才能在上面加 php 代码

如果不小心字符串过长了,样式可能会错乱,又要找前端调整样式。这样工作效率很低。最后 M 出现了,phper 可以在 M 上写 php代码,写完后,进行单元测试即可。

前端在 V 上写 html + css + js代码,这个过程是异步完成的,彼此之间互不影响,最后拼接的时候,用 C 调用一下 M 获得数据后,再渲染到 V 上即可。

C就是个桥接器而已。但现在的开发模式又变了,出现了很多后台和前台框架,这使得 M 和 V 的地位一下子下降了。 很多 M要完成的功能,后台框架包办了,如 ThinkPHP,很多 V 要完成的功能,前台框架包办了,如 Amaze UI。

因为框架技术的发展,导致很多程序员的开发效率大增,开发成本大幅度下降。 许多 phper不需要依赖前端也可以开发出非常出色的网站。使得 MVC 本来为了协同开发而设计出来的模式显得不是那么重要了。所以完全可以用 C 替代 M。

但受 ThinkPHP 框架限制,有些功能,如多对多关联模型,只能在 M 中实现。所以有时还是要用 M。有时一套 CMS中要可以选择多套模板,这时就需要前端分担一些工作量,不然 phper 要累死了。

拙人之见

模型可以继承model基类对数据库进行操作,也可以不继承model基类进行操作,模型不是必备的

当业务逻辑较小也比较简单时可以用控制器来代替,例如验证码

与视图变化没有什么关联的逻辑处理最好使用控制器

一般处理接收参数、判断逻辑IF语句,引用相对应的模型进行处理,不引用的时候,模型就相当于一个工具包而已,引用的时候就相当于拿出了这个工具包里的例如锤子进行一些工程处理

M中的方法是可以在C中方便调用的;如果直接写在C中就不灵活了;

举个小栗子:

1.没有模型的时候,控制器就得自己下厨做饭,然后传递给视图,在业务逻辑不多比较简单的时候,可以直接写死在控制器上。

2.有模型的时候,控制器就只需要把指令传给(调用)相对应的模型,模型做好饭之后,控制器拿去给视图(渲染),适用于业务逻辑较为复杂的情况。

这两者可以共存,有些地方如验证码可以直接用控制器,这样代码量会少很多。

这个其实是跟CSS的内联和引用是一个意思,多的时候单独写肯定是更好的选择,但是如果说我只有一两条CSS的样式那肯定是内联就好了呀


Thinkphp5中的模块、控制器及操作的URL网址路径

设置快捷路由
screenshot.png
模块,就是从你域名后第一道斜杠目录,控制器里是一个规定好的名字,子目录就是你域名后的第二道斜杠目录,操作方法.php则是第三道斜杠目录(通过ThinkPhp的智能识别,.php不会在域名显示)
官方文档:ThinkPhp5目录结构
application等同于app(两者可互换),所以我们的命名空间
thinkphp/library/think/等同于think
建议文件名按照小写格式
application/模块/[控制器|模型|视图|验证器]/操作方法(默认为Index)
展示给我们看的域名URL经过ThinkPhp的智能化转换,所以看不到真实路径中的app、controller等字眼出现
如我们要访问首页
实际路径应当为application/index模块/controller/index.php
域名访问路径为XX.com/index/index
(index.php)
....这个两者关系还是等我画个图再放上来吧

一个小视频了解非零和游戏 打赏
请作者吃个鸡腿!
ThinkPhp5绑定路由的一些小心得,子域名这样绑定路由模块也能够做到全绿

该页面评论已关闭