ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 在这里咱们从三个方面对代码进行优化 ### 1\. 安全性 > 提高安全性,减少代码量,提高执行效率,减轻服务器压力 ### 2\. 规范性 > 写程序要养成良好的习惯,使写出的代码更为规范。每一个框架通常情况下,都有自己的一套规范。所以在使用其进行开发时,一定要书写规范。 ### 3\. 代码的复用性 > 提高代码的复用性,减少了代码量,提高了程序的可读性。 ## 1\. 安全性代码优化 > 在这里从以下两个方面进行优化 > > 1. 加入请求类型判断,只有符合条件的请求才会进向后续的操作。如果请求类型不对,直接丢弃! > 2. 对用户提交的数据进行过滤(ThinkPHP官方有详细的说明) ## 2\. 代码规范化 > ThinkPHP是基于MVC(模型-视图-控制器)的方式来组织。虽然MVC框架并不要求 M、V、C同时存在,但是MVC的开发模式是比较合理的。所以在开发时,尽量严格遵循MVC的开发模式。 > 在这里会引入ThinkPHP中模型的概念。TP中的模型可以理解为具有特殊功能的类。在这里咱们使用的是TP框架,所以要遵循TP中的框 架结构。 > 要使用MVC模式进行开发,首先需要知道并理解模型的作用。 > 每个模块拥有独立的MVC类库及配置文件,一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。 > 控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理。 > 注意:使用模型获取数据时,一般情况下返回的是对象,而数据库类返回的是数组。所以在使用时,在实际应用中需要了解模型对象与数组之前的转换。 > 1. 模型对象支持数组方式访问 ~~~ $user = User::find(1); echo $user->name ; // 有效 echo $user['name'] // 同样有效 $user->name = 'thinkphp'; // 有效 $user['name'] = 'thinkphp'; // 同样有效 $user->save(); ~~~ 2. 可以使用toArray方法将当前的模型实例输出为数组 ~~~ $user = User::find(1); dump($user->toArray()); ~~~ 3. 支持设置不输出的字段属性 ~~~ $user = User::find(1); dump($user->hidden(['create_time','update_time'])->toArray()); ~~~ 4. 数组输出的字段值会经过获取器的处理,也可以支持追加其它获取器定义(不在数据表字段列表中)的字段 ~~~ $user = User::find(1); dump($user->append(['status_text'])->toArray()); ~~~ 5. 支持设置允许输出的属性 ~~~ $user = User::find(1); dump($user->visible(['id','name','email'])->toArray()); ~~~ 6. 如果是数据集查询的话有两种情况,由于默认的数据集返回结果的类型是一个数组,因此无法调用toArray方法,必须先转成数据集对象然后再使用toArray方法,系统提供了一个collection助手函数实现数据集对象的转换,代码如下: ~~~ $list = User::all(); if($list) { $list = collection($list)->toArray(); } ~~~ 7. 可以设置模型的数据集返回类型,如果设置了返回类型,那么就可以直接转数组了。 ~~~ <?php namespace app\index\model; use think\Model; class User extends Model { protected $resultSetType = 'collection'; } ~~~ > 以上关于模型数据的处理,一定要熟悉 ### 实例: 以管理员列表为例 1. 没有使用模型时,获取数据直接在控制器的`index`方式中使用数据库类进行操作 ~~~ <?php //控制器代码片段 ...... public function index() { //获取管理员信息-分页 $list=db('manager')->order('id Desc')->select(); $this->assign('list',$list); return view(); } ...... ?> ~~~ 2. 引入模型后,的代码片段如下 ~~~ <?php //控制器代码片段 public function index() { //获取管理员信息-分页 //实例化manager模型 $list=ManagerModel::getlistall(); $this->assign('list',$list); return view(); } ?> ~~~ ~~~ <?php //模型中代码片段 //获取所有管理员数据 public static function getlistall(){ $list=self::all(function($query){ $query->order('id', 'Asc'); })->toArray(); return $list; } ?> ~~~ ## 3.代码的复用性 > 在开发过程中,要尽量提高代码的复用性。减少代码量,提交开发效率。 ### 实例 在这里以以下两个功能代码为例进行优化: #### 1\. 关于异步请求返回`json`数据的代码优化 原始控制器代码: ~~~ ........ if(!$result){ return json(['code'=>0,'msg'=>"修改失败"]); } return json(['code'=>1,'msg'=>"修改成功"]); ........ ~~~ > 代码虽然不多,但是每次都要写`'code'=>1`和`'msg'=>''`,所以在这里对基进行优化 > 化优方法,写一个函数来组织返回数据,函数代码如下: ~~~ <?php function returnjson($code=1,$msg=""){ return json(['code'=>$code,'msg'=>$msg]); }; ~~~ 优化后的控制器代码如下: ~~~ <?php ........ if(!$result){ return returnjson(0,"修改失败"); } return returnjson(0,"修改成功"); ........ ~~~ > 优化后的代码,看似代码量有所增加,实际上更加快捷。 #### 2\. 管理加管理员和修改管理员 > 添加管理员和修改管理员,通过分析代码可以发现,两者的代码相似度非常高,所以可以考虑一下,能不能将这两部分的代码进行合并。 ##### **分析:** 两者的不同点 1. 提交的数据不同,修改管理员时,需要提交所修改管理员的ID 2. 所使用的验证场景不同 3. 修改和添加所使用的模型方法同 两者的相同点 1. 数据表相同 2. 验证器相同 3. 模型相同 4. 数在的接和返回形式相同 ##### 合并后的方法如下(模型中): ~~~ //添加/修改管理员 public static function store($data){ if(isset($data['id'])){ $scene='edit'; $msg="修改"; $action="update"; }else{ $scene='add'; $msg="添加"; $action="create"; } //验证数据的合法性 $valiManager=validate("Manager"); if(!$valiManager->scene($scene)->check($data)){ return returnjson(0,$valiManager->getError()); } //写入数据库 unset($data['repasswd']); $result=self::$action($data); if(!$result){ return returnjson(0,"{$msg}失败"); } return returnjson(1,"{$msg}成功"); } ~~~