octopus_new
V2EX  ›  问与答

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

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

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

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

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

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

    所以数据相关的操作都归类到M中,这样所有的C都可以调用M中的操作。
    raincious
        20
    raincious  
       Jul 11, 2013
    也有类似疑问的路过。

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

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

    现在看当然是放在postsModel里面最好,通过参数返回错误回交给Controller处理就好。但有些文章直接说Model应该只负责跟数据库沟通就好了,属于只做事但不问问题的,这些应该放在Controller里。不过,如果照做,那么Controller里面必然会出现重复代码的啊。
    kakaryan
        21
    kakaryan  
       Jul 11, 2013
    @raincious 在Controller和Model之间应该封装一个业务层,业务层封装业务逻辑,在业务层去调用Model层,Controller不直接调Model.业务逻辑都封装到Model会导致Model越来越臃肿,也是不合适的.
    66beta
        22
    66beta  
       Jul 11, 2013
    比较流行的框架,比如laravel和CI,都是主张C制作跳转,M做数据处理(验证之类的)
    Laravel的route更加减轻了C的工作
    iloveyou
        23
    iloveyou  
       Jul 11, 2013
    @kakaryan 现在好多框架都是业务层和model在一起
    shinwood
        24
    shinwood  
       Jul 11, 2013
    @octopus_new gmail 地址即 shinwood at gmail.com
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   943 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 19:44 · PVG 03:44 · LAX 12:44 · JFK 15:44
    ♥ Do have faith in what you're doing.