问一个关于一些PHP MVC框架业务逻辑的问题,希望大侠们帮忙释疑。

2013-07-10 16:16:33 +08:00
 octopus_new
最近在看一些关于MVC的文章,有一些疑问。
V相对比较好理解,主要负责呈现。
M和C总是感觉有些理解困难。因为某些文章说业务逻辑放在controller部分,而M只负责数据。如果这样的话,就变成了重C轻M。但是老外的文章中讲的都是重M,轻controller,说是尽量让controller只作为桥梁。而且国内一些网上的教程会把CRUD的操作代码放在controller,而Model只作为数据库的gateway,如果教条起来的话,这是不是不规范呢?是不是应该把CRUD封装到model里面,然后view直接调用结果,而大部分的controller功能应该是响应用户Routing的请求或者检查用户登录状态之类的程序逻辑?

或者说我对于MVC的理解有问题,很希望能有人能指点迷津。
5632 次点击
所在节点    问与答
24 条回复
manoon
2013-07-10 16:19:06 +08:00
PHP都已经忘记了。
如果在PYTHON里面的话,我是这样理解的。M只负责数据。C负责操作。
octopus_new
2013-07-10 16:27:12 +08:00
@manoon 那就是说,如果在python里面的话,C就应该负责CRUD(如果用sql的话),而M则作为数据与业务之间的连接层?还有就是MVC应该只要是OO语言就差不多吧。
因为我是看国外的一些文章是说应该让M做尽量多的事情,而C应该尽量轻。如果CRUD都给C的话,势必无法达到上述效果。而且看了一些国内的代码,好像也都是C负责CRUD,难道是我理解有问题......
xunyu
2013-07-10 16:29:13 +08:00
我也只有python的MVC框架,php的没有,可以参考下,在https://github.com/xunyuw/2in.me
感觉上M的功能是只有数据,还有封装模板,route的都在c里面实现
octopus_new
2013-07-10 16:39:38 +08:00
@xunyu 恩,Route应该是在C里实现,我现在就是对于数据库的一些操作是否应该放到C里面感到困惑。比如我要查询某个用户的信息,那么数据库的query应该在M层,还是C层发起呢?
moxuanyuan
2013-07-10 16:43:31 +08:00
我一直都有这个confusion
xunyu
2013-07-10 16:48:22 +08:00
@octopus_new 应该是c层发起,然后存放到M中,之后直接从M中取,举个开车的例子,m就是汽车,c是司机,应该是由c做总体控制
octopus_new
2013-07-10 16:48:25 +08:00
@moxuanyuan 我以为只有我一个人呢,原来还有同路人,那就一起同问吧:)
xunyu
2013-07-10 16:51:51 +08:00
我对MVC的见解是这个模型更贴近数据驱动而不是面向对象,在M里面放入不同的数据模型,让通过c来取到数据以后根据模型的不同实现v显示上的差异
octopus_new
2013-07-10 17:06:46 +08:00
@xunyu 非常感谢,我又去看了一下tutsplus上的一篇文章,结合你说的,感觉理解。
响应用户request的query在C,然后C交给M去做,是这个意思吧?
shinwood
2013-07-10 17:08:55 +08:00
严格来说,Controller 只负责分发 URL 以及将数据整合后传递给 View,和数据库交互这部分应全部交给 Model。
Aether
2013-07-10 17:09:44 +08:00
我的理解是至少要涉及数据库的,都放在M里封装的。
这个时候C的数据操作看上去都是抽象的。

你可以把一些复杂的数据逻辑放在M里,这个时候被封装的部分尽量是黑箱的,可复用的。这个时候c只负责把各处收集来的信息作为参数传入(c的作用不正是这个么)
octopus_new
2013-07-10 17:25:42 +08:00
@shinwood
@Aether
那么比如我有一个Model里有个叫User的对象,操作一个叫user的db table。然后我有个叫userList的controller,当然用户要求查询张三的时候是不是在controller部分应该call User里的方法来进行操作,比如:User.find(‘张三’)这种code就应该是在controller里面的,具体的操作就都是由User这个对象的方法来做, 是这个意思吧?
shinwood
2013-07-10 17:36:26 +08:00
@octopus_new 对,是这个意思,但一般 userlist 作为单独的 controller 有点奇怪,作为 controller 的一个 function 听起来比较合适,比如 /member/list,这当中的 list 为你说的 userlist 功能。
octopus_new
2013-07-10 17:49:28 +08:00
@shinwood 真的是非常感谢:), 消除了我这几天来的疑惑。我其实是想说userList是controller的一个方法的,想着想着就打错了......
Aether
2013-07-10 18:00:22 +08:00
@octopus_new 我没啥要表达的了,@shinwood 都说完啦。
另外我对MVC的理解主要都是基于我对CodeIgniter的把玩,其他框架没试过。CI很简洁,适合新手,你可以研究一下,稍微看看一下源代码,自己做一些实例就理解了。
lichao
2013-07-10 18:10:49 +08:00
我直到接触 Ruby on Rails 才真正理解 MVC
octopus_new
2013-07-10 18:14:35 +08:00
@Aether 我是最近在折腾Laravel, 然后就琢磨起来MVC了, 回头去看看CodeIgniter, 感觉这些框架在设计理念上都是遵循MVC的,所以应该也是大同小异吧。写程序一直都是我的一个小爱好, 但是一直都没深入的去研究框架、设计模式什么的。我是最近业余给公司做个PHP项目, 然后老板想法越来越多, 觉得有必要用框架来实现了才开始研究PHP的框架(之前都是自己琢磨Python的一些东西), 完全是初学者, 以后可能还要有很多问题请教呢 :).

To both of @shinwood and @Aether
如果可以的话, 可不可以赏个email, 方便以后联络, 非常感谢!
ivanlw
2013-07-11 00:46:12 +08:00
Python不应该是很多MTV的么…………Django, Flask
ETiV
2013-07-11 01:00:06 +08:00
我理解的MVC是一种代码的组织结构

目的是为了「少写重复的代码」

所以数据相关的操作都归类到M中,这样所有的C都可以调用M中的操作。
raincious
2013-07-11 07:37:24 +08:00
也有类似疑问的路过。

比如有一个postController和一个replyController,他们操作一个postsModel。

但是现在如果有共用的函数,比如isValidTitle以及isValidBody,那么是在哪里实现比较好呢?

现在看当然是放在postsModel里面最好,通过参数返回错误回交给Controller处理就好。但有些文章直接说Model应该只负责跟数据库沟通就好了,属于只做事但不问问题的,这些应该放在Controller里。不过,如果照做,那么Controller里面必然会出现重复代码的啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/75364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX