php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥
## TP5實戰技巧實例---開發思路
> 子曰:“學而不思則罔,思而不學則殆。”
[TOC]
### 利用TP的MVC框架 做快速開發
>[success] 寫在前面的話:既然選擇TP5框架,我推薦大家要通讀完全開發手冊,我這里并不是要大家記住每一個方法,每一個細節.而是要求大家心理清楚TP5到底有哪些功能,能替我們解決什么樣的問題!
在程序開發中,隨著前端的技術發展,以及跨平臺的綜合應用,PHP為主流的程序開發越來越側重開發API.
我們就已API開發為例,介紹一些開發的實際流程.

>[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們 如何才能讓開發更簡單呢
未完 待續--
詳情見下節
大家希望后續看到哪方面的 可以在這里留言給我!
總結
以上是生活随笔為你收集整理的php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 耳机也有帝瓦雷!华为FreeBuds P
- 下一篇: 《瘟疫传说:安魂曲》10月18日发售:全