php模型和控制器之间交互

学习使用的是Tp5.1

在看别人代码的时候想很多关于数据库的操作之间写到控制器里面了;

public function save()
{
    $data = input('post');
    $validate = $this->validate($data,"app\\common\\TestValidate");
    
    $result = (new UserModel)->save($data);
    
    if($result){
        return $this->success('操作成功');
    }else{
        return $this->success('操作失败');
    }
}

但是有人说这样就没必要用模型,可以将写入数据的方法写到model里面

但是写在model中在控制器调用的时候如何判断是否写入成功呢?
还有就是将数据验证是应该写在控制器还是模型??

比如用户注册 前端提交->控制器接收请求->模型
这之中的数据验证写到控制器还是模型

如果写到控制器没什么疑问,但是如果写到模型

模型中验证失败返回false 咋样返回错误信息呢? 难道说模型中返回一个数组['status'=>0,'msg'=>'手机号码已经被注册'];

之后由控制器接收模型返回的该数组 判断返回的status吗?

还有顺便问问服务层和逻辑层该如何运用??

问题有点多,希望大家告知下,多谢!

阅读 6.4k
6 个回答

我觉得楼主问的重点应该是这一行:

模型中验证失败返回false 咋样返回错误信息呢? 难道说模型中返回一个数组['status'=>0,'msg'=>'手机号码已经被注册'];

如果把处理数据的代码都放到模型中,有时通过后要返回数据,不通过需要返回错误提示信息,在控制器中要作出判断确实有些麻烦。

统一返回的数据格式为['status'=>0/1,'info"=>msg/data] 确实是一种方法。
但写起来总觉得有些麻烦。

当然,返回的 msg 一般是 string,而返回的 data 一般是 array,所以,通过判断返回的数据类型也是可以考虑的。(但有时又会有特例)

所以,还是直接写到控制器中比较方便。

如果数据处理的逻辑比较复杂,而且可能在其它控制器中会用到,那么,写到模型中去。
如果逻辑比较简单,其它控制器中不可能用到,写到控制器中比较方便。

你要追求严谨,就要牺牲“便利性”!
然而,PHP 是一门很追求“便利性”的语言。

1.MVC了解一下!逻辑控制写在控制器,数据处理写在model里。
2.控制器调用model中的方法,model的方法执行成功或者失败返回布尔值,然后控制器根据布尔值来判断执行的结果。
3.答案1

你看到的应该是很多普遍存在的一种形式,或者说是使用某种框架然后偏离了我们的初衷!
首先对于编程设计思想MVC来说,我们已经将前后端分离了,那么我们也继续在后端将控制器和模型处理也分离,那么我们的数据处理确实应该写在model里面,控制器只是负责调度

如果完全遵循MVC的话,数据处理肯定放model啊,然后controller负责调用model 然后根据model返回的数据来进行逻辑处理,TP中model也是可以validate的。

服务层就是model的一个分层service,一起分出来的还有logic,他们就是对model的一个分离,service负责提供给controller的接口,而logic帮助controller处理逻辑。
比如验证 可以model只做增删改查,logic调用model做判断并且处理逻辑 再返回给service。
就是为了降低方法之间的耦合

按道理来说是应该写在model中,但是现在数据库查询各种AR封装方法就是方便你直接写的,所以简单的直接在controller中:

(new UserModel)->save($data);

难道还需要特意在model中再封装一下?

public function saveUser(){
    self::save();
}

也许有人觉得统一封装后方便修改,但现在IDE中批量修改也很方便,而且基本不会出现这种情况,个人是感觉没必要,简单的数据库交互可以直接在controller中写,复杂的而且需要复用的交互才需要放在model中。

MVC里最重要的就是M,也就是model,控制器只是做中转,所有和数据或者数据库打交道的地方一般放到model里去做,有些框架会把model层再细分为service层和logic层

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题