## 在這里咱們從三個方面對代碼進行優化
### 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
- 其他類庫
- 百度
- 百度語音
- 快遞
- 跨域問題
- 寶塔
- 搜索記錄