V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
octopus_new
V2EX  ›  问与答

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

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

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

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

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

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

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

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

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

    现在看当然是放在postsModel里面最好,通过参数返回错误回交给Controller处理就好。但有些文章直接说Model应该只负责跟数据库沟通就好了,属于只做事但不问问题的,这些应该放在Controller里。不过,如果照做,那么Controller里面必然会出现重复代码的啊。
    kakaryan
        21
    kakaryan  
       2013-07-11 10:10:03 +08:00
    @raincious 在Controller和Model之间应该封装一个业务层,业务层封装业务逻辑,在业务层去调用Model层,Controller不直接调Model.业务逻辑都封装到Model会导致Model越来越臃肿,也是不合适的.
    66beta
        22
    66beta  
       2013-07-11 10:14:23 +08:00
    比较流行的框架,比如laravel和CI,都是主张C制作跳转,M做数据处理(验证之类的)
    Laravel的route更加减轻了C的工作
    iloveyou
        23
    iloveyou  
       2013-07-11 10:17:34 +08:00
    @kakaryan 现在好多框架都是业务层和model在一起
    shinwood
        24
    shinwood  
       2013-07-11 10:53:45 +08:00
    @octopus_new gmail 地址即 shinwood at gmail.com
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:46 · PVG 06:46 · LAX 14:46 · JFK 17:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.