问一个关于一些PHP MVC框架业务逻辑的问题,希望大侠们帮忙释疑。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
octopus_new
V2EX    问与答

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

  •  
  •   octopus_new 2013-07-10 16:16:33 +08:00 6043 次点击
    这是一个创建于 4520 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在看一些关于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/span>
    @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     Solana     5249 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:28 PVG 09:28 LAX 17:28 JFK 20:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86