## TP5实战技巧实例---开发思路 > 子曰:“学而不思则罔,思而不学则殆。” [TOC] ### 利用TP的MVC框架 做快速开发 >[success] 写在前面的话:既然选择TP5框架,我推荐大家要通读完全开发手册,我这里并不是要大家记住每一个方法,每一个细节.而是要求大家心理清楚TP5到底有哪些功能,能替我们解决什么样的问题! 在程序开发中,随着前端的技术发展,以及跨平台的综合应用,PHP为主流的程序开发越来越侧重开发API. 我们就已API开发为例,介绍一些开发的实际流程. ![](https://box.kancloud.cn/2eb2dc6276bbce6ab92710731eabcb53_740x321.png) >[info] 一 控制器(Controller) > 获取参数数据 > 二 验证器(Validate) > 验证参数数据 > 三 模型 (model) > 处理逻辑和数据 返回结果 > 四 控制器(Controller) > 接受模型返回数据 显示数据 #### 控制器数据获取和处理 现在我从网上某TP5开源系统中找了一段控制器中的代码 ~~~ public function add() { //接收数据 if (Request::instance()->isPost()) { $data['name'] = input('post.adname'); $data['description'] = input('post.description'); $data['link'] = input('post.link'); $data['position'] = input('post.pos'); $data['level'] = input('post.level'); $data['createtime'] = time(); //链接图片 $coverPath = input('post.banner_path'); //实例化验证器 $validate = Loader::validate('Banner'); //验证 if (!$validate->scene('add')->check($data)) { return $this->error($validate->getError()); } //添加封面图 if ($coverPath) { $data['banner_path'] = $coverPath; } //插入数据表 $result = Db::name('Banner')->insert($data); if ($result) { return $this->success('添加成功',url('admin/banner/index')); } else { return $this->error('添加失败'); } } else { $pos=Db::name('BannerPosition')->where('status',1)->field('id,title')->select(); $this->assign('pos',$pos); return $this->fetch('add'); } } ~~~ >[warning] 这段代码是其实并没有大的问题 这段添加代码中整合静态页和数据逻辑处理 当post提交时候处理数据,get提交时候渲染静态页面 但有些问题还是能再改进一下就完美了 * * * * * 题外话:我现在我来简单说一下这段代码一些问题 1.在接收片段中使用了Request::instance()->isPost() 既然继承控制器可以直接使用$this->request->isPost() 2.过多的使用了input助手函数 3.非MVC理念 model被完全忽略 * * * * * 我们先讲一下控制器数据获取和处理.我们还拿上面的源代码 进行改进和示范吧 下面是我改进的方案,大家只要理解这样做的好处就可以了.我会先定义一个参数数据的变量数组$param ~~~ $param=[ 'name'=>'adname' 'description'=>'description' ... ... ]; ~~~ 我就写两个 做一下示范 另外我在控制器基类里写了下面一段代码 ~~~ /** * 数据库字段 网页字段转换 * #User: Mikkle * #Email:776329498@qq.com * #Date: * @param $array 转化数组 * @return 返回数据数组 */ protected function buildParam($array) { $data=[]; if (is_array($array)){ foreach( $array as $item=>$value ){ $data[$item] = $this->request->param($value); } } return $data; } ~~~ 那我在继承基类的控制器中 这样写代码就可以执行了,$param_data就是你要获取的参数值. ~~~ $param = [ 'name'=>'adname' 'description'=>'description' ]; $param_data = $this->buildParam($param); ~~~ >[info]如上面的例子中的 $data['createtime'] = time(); 这种固定的值的添加 记得扔到model的自动完成的方法完成 详情参见 http://www.kancloud.cn/mikkle/thinkphp5_study/331967 #### 控制器中数据值的验证 现在 数据已经获取 下一步就要进行数据验证 >[danger] 永远不要相信前端发送过来的数据 把控绝对不能忽略 当然前端的校验也是需要的 当后端必须要把关 上面这段验证的代码是没有问题的 可以使用 ~~~ //实例化验证器 $validate = Loader::validate('Banner'); //验证 if (!$validate->scene('add')->check($data)) { return $this->error($validate->getError()); } ~~~ 当然 使用官方的教程里的方法也是可以的 ~~~ $result = $this->validate($data, $validate_name); if (true !== $result) return ['code' => '1003', 'msg' => $result,]; ~~~ >[info] $validate_name 你控制器的名称 #### 验证数据通过后调用Model里的方法获取返回值 ~~~ $model_edit = Loader::model($model_name); if (!$model_edit) return $this->showReturnCode(1010); $data = $model_edit->$action_name($param_data); ~~~ >[info] $model_name 你模型的名称 > $action_name 你模型中执行方法的名称 这时 绝大多少的操作就基本完成了 根据需求返回$data的值就行了 ##现在就是思考的时间 万能的yuan们 如何才能让开发更简单呢 未完 待续-- 详情见下节 大家希望后续看到哪方面的 可以在这里留言给我!