Heim  >  Fragen und Antworten  >  Hauptteil

php - 验证写在controller还是model里?

之前团队留下的模型代码都是这样的:

public function getcount($where){//$where是数组,严格对应DB字段!
   if(!empty($where)){
    $db->where($where);
   }
   $db->from($tablename);
   return $db->count_all_results(); 
}

public function edit($tid,$data){//$data是数组,严格对应DB字段!
  $db->where('tid', $tid);
  return $db->update($tablename, $data);
}

当我在控制器里调用MODEL的时候,要严格按照数据库schema来拼装参数。

MODEL里这样写这样的纯粹的增删改查有什么优点?
验证部分究竟应该放在哪里比较好
请阐明其中的道理和厉害关系。

之前可能有人看的太快导致的误解,上述代码的model里面那个empty并不算真的判断,关于$where参数,是需要严格按照数据库对应的字段拼装,而model里并没有任何判断,严重依赖控制器喂给它正确的参数。

项目经理铁定要求在控制器处理验证,所以现在的控制器里有数量可观的巨型函数(需要调用model的地方都超过150行了),而且格式基本近似。

举个例子,现在的情况是:
view提交表单到controller,在那里验证表单,呼叫model,并为model拼装数组参数(如同上面代码里那样)。

看到后来新的答案里有些说的情况比较模糊,比如“复杂逻辑”这样还是没法明确。所以,我再细化一下问题:

现在的model里仅仅是转发了一下sql的增删改查的基本操作,在控制器里调用这些model的时候,我必须严格根据数据库里的字段名来拼装$data数组,这就基本等同于没有model,还不如控制器里直接拼sql算了。

天蓬老师天蓬老师2723 Tage vor1679

Antworte allen(19)Ich werde antworten

  • ringa_lee

    ringa_lee2017-04-10 15:02:26

    这个是不是只针对php, java 为什么在struts里有 validate 方法, Bean 里面只有 get set 方法

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:02:26

    需要分别处理,不能单单说是写在controller还是model,根据业务需求的不同经常会对验证做区别处理,model建议只做些基本的数据合法性验证

    Antwort
    0
  • 迷茫

    迷茫2017-04-10 15:02:26

    写在module是没有问题的,但是这里边涉及一个有意思的问题,就是如何将校验结果反馈回来。

    如果在module层做非常详细的错误报告,也是比较繁琐,而且可能会增加一些开销。而反馈的结果还需要反馈到controller,最后反映到view上。另一方面module也可能被程序直接创建修改,这时候的验证并不需要细粒度,只需要一个布尔就够了。

    所以一般我比较倾向于用一个简单逻辑的module验证,在controller中做错误报告的生成。

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-10 15:02:26

    看框架,大一点框架的Model封装的比较好。
    可以把一些逻辑写在Model里面。

    一般项目,建议独立出来把逻辑,权限验证等信息放在Logic里面。

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:02:26

    你这个问题有挂 laravel 标签, 请问是用这个框架么, 若是, 你可以使用 event 来实现, 例如:

    你新建一个 event.php(如何自动加载呢???), 示例代码:
    Event::listen('eloquent.saving: User', function($model){

    这里做验证, 附加操作逻辑等, 最后 return $model 就好

    });
    以上代码在调用内置 org, 如 User::save(), 会自动触发.

    其中是 saving可以换成creating, created, updating, updated, deleting, deleted, saving, saved, restoring, restored, auth.attempt, auth.login, auth.logout

    Antwort
    0
  • PHPz

    PHPz2017-04-10 15:02:26

    其实可在Controller和Model之间设置一个业务逻辑层,该层负责处理输入到数据录入的处理,一切业务参数验证及组装都可以交给业务办,这样即可,另外不同层处理不同事物,比如接受参数的HTTP层、路由层,都是可以加东西的,各层分而治之,没必要都给controller了,controller是中介,衔接作用,大而全就显得代码结构不清晰,降低了可维护性。

    Antwort
    0
  • 迷茫

    迷茫2017-04-10 15:02:26

    验证代码应该写在服务层
    那么这里就要对mvc解析一下

    v层由于变动频繁,而又非服务端程序员必理层,故此完全可以独立出来,以配置方式分发。
    m层是数据层,那就单纯处理数据就得了,不要添加其他没必要的处理,导致混乱。
    c层是调度层,对用户传递过来的url作对应处理,这里跟权限有关,登陆和没登陆的操作。
    那么这里少了一层,就是逻辑层logic。建议添加l层
    l层处理逻辑,提供服务,提供关闭和开放的决定。

    而验证建议使用c层的权限判断,而权限判断是一个服务,让l层提供。

    这样设计的好处不少

    v层对外,只提供配置文件,让有关程序员,只配置文件即可。
    其次m层可以独立出来一个专用服务器,也可安排专门处理这块的程序员负责。
    c层处理用户调度,掌握业务层和用户体验的程序员最适合。
    l层实际就是服务层,链接业务层和数据层,版本控制,启用和关闭服务。

    对新来的同事,验证服务有问题,可以让他重写一个验证服务,不必重写原来的验证的服务。这种修改方式,应该是养成习惯,不修改,只增加。

    对于楼主要解决的验证写在controller还是model里,这个问题,取决于架构问题。
    如果就是mvc,那么是否有不同角色权限,如果不是,可以选择新建一个基础c,里面配置一个用户验证。如果有不同角色权限,完全可以继承这个基础c,重写即可。
    建议在c层验证,个人认为,用户进来,进入调度范围,就必须要正确到达目的地,否则,我不知道调度的作用为何。
    如果没有设计缺陷,就放在c层验证吧,概念更清晰一些。
    c层验证,l层逻辑

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:02:26

    我们团队在使用MVC框架时, 都会独立一层Behavior出来, 这一层放业务逻辑.
    如果是数据本身进存储的时候需要验证, 那么就在model层做.
    如果是因为业务逻辑需要验证, 那么就在behavior层做.例如订单状态的流转,验证非法的状态流转.
    如果是和业务逻辑无关的(从controller层转发数据), 那么就在controller层做.
    v层由前端或者客户端自行验证,
    这样的好处是, behavior可以作为通用逻辑, 让controller有不同的展现方式.特别方便既有web也有接口功能的程序. 坏处是, 需求改动较大的时候, 需要对业务逻辑非常清晰

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:02:26

    倾向于 view - model - behavior - controller,
    数据本身进存储的时候需要验证 MODEL
    业务逻辑需要验证 BEHAVIOR
    和业务逻辑无关的 CONTROLLER

    Antwort
    0
  • StornierenAntwort