# TP5实战技巧---整合基类 化繁为简 >[warning] 接上节 TP5实战技巧---开发思路 引路造桥 [TOC] ## 细化拆分功能方法 丰富基类方法库 我们把常用的控制器方法封装到基类 ~~~ /** * Power by Mikkle * QQ:776329498 * @param string $code * @param array $data * @param string $msg * @return array */ static public function showReturnCode($code = '', $data = [], $msg = '') { $return_data = [ 'code' => '500', 'msg' => '未定义消息', 'data' => $code == 1001 ? $data : [], ]; if (empty($code)) return $return_data; $return_data['code'] = $code; if(!empty($msg)){ $return_data['msg'] = $msg; }else if (isset(ReturnCode::$return_code[$code]) ) { $return_data['msg'] = ReturnCode::$return_code[$code]; } return $return_data; } static public function showReturnCodeWithOutData($code = '', $msg = '') { return self::showReturnCode($code,[],$msg); } /** * 数据库字段 网页字段转换 * #User: Mikkle * #Email:776329498@qq.com * #Date: * @param $array 转化数组 * @return 返回数据数组 */ protected function buildParam($array=[]) { $data=[]; if (is_array($array)&&!empty($array)){ foreach( $array as $item=>$value ){ $data[$item] = $this->request->param($value); } } return $data; } ~~~ >[info] 这些方法貌似比较简单 > 那么我们能不能封装一些复杂的方法呢 > 其实没有什么能难的到万能的yuan们 下面 我尝试把上一节的操作 尝试封装一个方法 ~~~ /** * 快速修改 * #User: Mikkle * #Email:776329498@qq.com * @param $array * @param bool|false $validate_name * @param string $model_name * @return array 返回code码 */ protected function editData($parameter = false, $validate_name = false, $model_name = false, $save_data = []) { if (empty($save_data)) { if ($parameter != false && is_array($parameter)) { $data = $this->buildParam($parameter); } else { $data = $this->request->post(); } } else { $data = $save_data; } if (!$data) return $this->showReturnCode(1004); if ($this->checkLoginToken() && !isset($data['uuid'])) $data['uuid'] = $this->uuid; if ($validate_name != false) { $result = $this->validate($data, $validate_name); if (true !== $result) return $this->showReturnCodeWithOutData(1003,$result ); } $model_edit = Loader::model($model_name); //dump($model_edit); if (!$model_edit) return $this->showReturnCode(1010); return $model_edit->editData($data); } protected function doModelAction($param_data,$validate_name = false, $model_name = false,$action_name='editData'){ if ($validate_name != false) { $result = $this->validate($param_data, $validate_name); if (true !== $result) return $this->showReturnCodeWithOutData(1003, $result); } $model_edit = Loader::model($model_name); if (!$model_edit) return $this->showReturnCode(1010); return $model_edit->$action_name($param_data); } ~~~ ## editData方法解析 我详细讲一下 editData 这个方法的过程 >[info] 这段代码中的参数 > $parameter = false, 控制器参数重整数组 > $validate_name = false, 验证器名称 > $model_name = false, 模型名称 > $save_data = [] 操作的值 ### editData方法取值部分 我们先看一下这段代码的第一部分 1. 判断是否存在已经给定的值 2. 判断数据重整数组是否存在 ~~~ //判断是否存在已经给定的值 if (empty($save_data)) { //判断数据重整数组是否存在 if ($parameter != false && is_array($parameter)) { $data = $this->buildParam($parameter); } else { $data = $this->request->post(); } } else { $data = $save_data; } //把关看看数据是否存在 if (!$data) return $this->showReturnCode(1004); ~~~ > if ($this->checkLoginToken() && !isset($data['uuid'])) $data['uuid'] = $this->uuid; 这部分是判断是否全局登录 如果登陆 附加上用户的UUID ### editData方法数据验证部分 ~~~ if ($validate_name != false) { $result = $this->validate($data, $validate_name); if (true !== $result) return $this->showReturnCodeWithOutData(1003,$result ); } ~~~ 这个没有什么说的 官方示例 ### editData方法数据处理部分 ~~~ $model_edit = Loader::model($model_name); //dump($model_edit); if (!$model_edit) return $this->showReturnCode(1010); return $model_edit->editData($data); ~~~ >[info] 注意 : 这个方法中调用了model的 editData方法 > 要怎样让所有调用的model都有这个方法呢? > 呵呵 这不是废话 肯定写到model的基类里了 在model的基类里 添加 editData 数据处理方法 > 模型基类的创建 > https://www.kancloud.cn/mikkle/thinkphp5_study/381919 ~~~ /** * 根据有Id修改信息 无Id 新增信息 * #User: Mikkle * #Email:776329498@qq.com * #Date: * @param $data * @return false|int|string * @throws */ public function editData($data){ if (isset($data['id'])){ if (is_numeric($data['id']) && $data['id']>0){ $save = $this->allowField(true)->save($data,[ 'id' => $data['id']]); }else{ $save = $this->allowField(true)->save($data); } }else{ $save = $this->allowField(true)->save($data); } if ( $save == 0 || $save == false) { $res=[ 'code'=> 1009, 'msg' => '数据更新失败', ]; }else{ $res=[ 'code'=> 1001, 'msg' => '数据更新成功', ]; } return $res; } ~~~ > 这段代码中 当ID存在为修改,当ID存在则新增。具体我就不解析了 ## 化繁为简 破蛹而出 > 下面 我们的基类写的差不多了,换句话说,我们的祖宗们供奉的差不多了 好日子就来了 控制器中然后调用我们使用的方法呢? * 当数值字段和数据库字段相同时 控制器的代码 一共三行 ~~~ //手机页面添加项目 public function saveProject(){ $validate_name = "base/ProjectEnty.edit"; $model_name='base/Project'; return json($this->editData(false,$validate_name,$model_name)); } ~~~ >[danger] 当然验证器和model你点自己写 如果 你也可以想其他办法 生成也不是难事 不过太懒你容易失业哦 另外这个控制器的方法也不是我写的,没有加我的注释信息 * 当有附加数据时 多了几行(包括ajax验证) ~~~ public function addStructureData() { if($this->request->isAjax()){ $data = $this->request->post(); $data['project_guid']=$this->request->param('project_guid'); $validate_name='base/ProjectStructure.edit'; $model_name='base/ProjectStructure'; return json($this->editData(false,$validate_name,$model_name,$data)); } } ~~~ >[info] 如果字段不同时候 加上转换数组就行 > $param = [ > 'username' => 'username', > 'password' => 'password', > ]; * 控制器中使用 doModelAction 方法 ~~~ /** * 登陆验证 * Power by Mikkle * QQ:776329498 * @return array */ public function login(){ if ($this->request->isAjax()) { //数据库字段 网页字段转换 $param = [ 'username' => 'username', 'password' => 'password', ]; $param_data = $this->buildParam($param); // $param_data['id'] = $this->request->get('id'); $check_login = $this->doModelAction($param_data, 'base/PersonnelUser.login', 'base/PersonnelUser', 'checkLogin'); if (!isset($check_login['code'])) $this->showReturnCodeWithSaveLog(1111); if ($check_login['code'] == 1001) { Session::set('menber_info', $check_login['data']); $this->setLoginGlobal($check_login['data'], 1); } return $check_login; }else{ return $this->fetch("login"); } } ~~~ >[danger] 本节最后的话: > 万能的猿们 让方便的道路上无止境 ... > 如果你还在开发,是时候停下来想一下 你到底想要的是什么 > 最后 那下面的代码又是什么呢 > ~~~ > public static $system=[ > //companyList > 'companylist' => [ > 'action_name' => 'showEasyUiList', > 'model_name' => "base/PersonnelCompany", > 'validate_name' => '', > 'template_name' => 'company_list', > 'assign_data' => [ > 'title' => '公司管理列表', > 'dialog_url' => 'companyEdit', > 'data_url' => '', > ], > ], > 'companyedit' => [ > 'action_name' => 'showEasyUiEdit', > 'model_name' => "base/PersonnelCompany", > 'validate_name' => 'base/PersonnelCompany.edit', > 'template_name' => 'company_edit', > ], > ~~~ EditData相关教程 >[danger] 数据的添加和修改 >https://www.kancloud.cn/mikkle/thinkphp5_study/440935 >[danger] EditData快捷类库的使用方法 >https://www.kancloud.cn/mikkle/thinkphp5_study/462693 使用独立的修改类库 推荐使用 ~~~ $paramList = [ "company" => "company/s", "address" => "address/s", "contacts" => "contacts/s", "jobs" => "jobs/s", "mobile" => "mobile/s", "tencent_code" => "tencent_code/s", "desc" => "desc/s", "event_key" => "event_key/n", ]; $validate_name = "base/system/SystemApply"; $model_name = 'base/system/SystemApply'; $re = EditData::instance() ->setParameter($paramList) ->setAppend(["append" => "this is append"]) ->setValidate($validate_name) ->setModel($model_name) ->save();; return $re ? ReturnCode::jsonCode(1001) : ReturnCode::jsonCode(1003); ~~~ >[danger] 加QQ群 735730057 有完整版扩展类库下载!