## 在这里咱们从三个方面对代码进行优化
### 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}成功");
}
~~~
- 课程介绍
- thinkphp5.0
- 安装
- 开发规范
- 目录结构
- 配置参数
- 系统常量
- tp5自带的函数
- 助手函数
- 扩展类库
- 基本类库
- Workerman
- think-queue
- 验证码
- 图片
- 权限认证
- 课前准备
- 数据库设计
- 模块设计
- 管理员管理
- 添加
- 编辑
- 删除和批量删除
- 列表页
- 实列
- 权限管理
- 操作日志
- 基于行为的日记录
- 行为日志的扩展
- 助手类库
- 自建函数
- 将数组转成uri字符串
- 获取当前服务器的IP
- curl-post
- 截取文字中间的字符串
- 检查中文姓名
- 省市区分别截取
- 抽奖概率问题
- 短信邮箱模板替换
- 生成csv
- PHP 图片转base64
- 银行卡验证
- json返回接口封装
- 无限极分类
- 病毒
- xml和数组互转
- xml转成数组
- 数组转xml
- tp控制器相关
- 获取thinkph5下控制器和方法名
- 后台查询的简单封装
- 网址信息
- 获取网站logo
- 判断url是否存在
- 获取title
- 判断远程文件是否存在
- 获取页面所有链接
- 过滤
- 截取
- 时间
- 获取服务器信息
- 根据id生成唯一邀请码
- 随机颜色
- 数组字符串互换
- 创建多级目录
- 懒人查询
- 时间和时间戳转换
- 房间id生菜
- 获取需要的数组元素
- 文件和文件夹
- 文件类库
- 文件夹
- 七牛云
- 七牛云运用场景
- 七牛云使用实例
- 邮箱
- 邮箱验证
- 邮箱发送
- 数据库
- 数据库在thinkphp中的补充方法
- 备份和安全
- sql执行
- 数据库备份2
- 时间日历
- 时间格式化
- 日历
- 图片相关
- 自动获取图片主题颜色
- 获取html中的图片路径
- 获取图片场景
- 获取图片实践
- 图片处理类
- 图片处理场景
- 图片处理实践
- 数据验证分析
- 身份证相关
- 新闻
- 自建类库
- 简易分类库
- php 压缩CSS代码
- 身份证
- 分词和抽词
- 分词应用场景
- 分词实践
- 中文转拼音
- 中文转拼音场景
- 中文转拼音实践
- 二维码操作
- 二维码场景
- 二维码实践
- 短地址
- PHPWord
- 插件化
- 插件扩展库
- 插件列表
- 插件安装和卸载
- 插件实践
- 插件的离线安装
- 计划任务
- 计划任务安装
- 计划任务实践
- 定时器
- 注册登录
- 普通登录注册
- 第三方登录注册
- jwt接口登录注册
- 短信
- 飞鸽短信
- 阿里短信
- 消息队列
- 网站地图
- 全站静态化
- 缓存
- 文件导出
- PDF生成
- phpword
- PHPExcel
- 其他类库
- 百度
- 百度语音
- 快递
- 跨域问题
- 宝塔
- 搜索记录