## MVC 邏輯規范
區別于傳統的MVC模式,對項目的邏輯思想做如下規范:
>[danger] Controller層 做調用和頁面渲染,以下簡稱C層
如有公用調用方法,需要繼承類似名為BaseController的來處理
>[danger] Model層 做核心邏輯處理和數據庫操作,以下簡稱M層
如有公用邏輯,需要繼承公共類如名為BaseModel的來處理,BaseModel繼承 底層的Model做數據庫操作
*說明:*
*用戶相關的在 `User.php`這個model里面直接查找,無需通過URL一條一條向后找具體的文件是哪一個;*
*群組相關的一定是在`Group.php`這個model里面查找。*
>[danger] View層 僅處理頁面顯示和引入靜態文件,以下簡稱V層
不做復雜的數據操作
>[danger] 靜態文件處理
JS、CSS文件需要統一放到一個地方,view層視圖文件分別引入
如有必要,請考慮加載速度,以CDN加速來處理的方式,需要在 靜態文件前加入 cdn 地址
## 簡單示意圖如下

以下為 IM3.0項目 示例代碼:
<?php
namespace app\common\model; // 前后必須要有空行
use think\Model;// 前后必須要有空行
class App extends Model // 大括號換行寫
{
// 自定義 表主鍵
protected $pk = 'id';
// 自動義 表名
protected $name = 'app';
// 設置JSON類型字段
protected $json = ['configs'];
/**
*
* Notes: 應用綁定管理員,一對一從屬關系
* 即,一個應用屬于某一個管理員,一個管理員只有一個應用
*
* @return \think\model\relation\HasOne
*/
public function admin()
{
return $this->belongsTo('Admin', 'aid');
}
/**
*
* Notes:應用綁定版本,從屬關系,
* 即:一個應用屬于某一個版本,版本不能新增,但可以修改
*
* @return \think\model\relation\BelongsTo
*/
public function version()
{
return $this->belongsTo('ImVersion', 'aid', 'aid');
}
/**
*
* Notes:保存/修改應用數據
*
* @param array $arr
*
* @return \app\common\model\App|bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function config($arr = [])
{
/*老板寫的好簡單明了*/
$aid = $arr['uid'];
$data = ['aid' => $aid,] + $arr; // 追加數組的寫法
if (self::where('aid', $aid)->find()) {
unset($data['aid']); // 釋放內存
return self::where('aid', $aid)->update($data); // 更新數據
} else {
return (new self)->save($data); // 保存數據
}
}
/**
*
* Notes:獲取 下拉多選 框的應用列表
*
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getList()
{
// 先查詢 應用列表 數據
$apps = self::field(true)->select();
// 初始化返回數據為一個數組
$data = [];
// 遍歷取值往data里追加數據,id和域名名稱
foreach ($apps as $v) {
$data[] = [
"name" => $v->domain,
"value" => $v->id,
"selected" => "",
"disabled" => ""
];
}
// 返回數據
return $data;
}
控制器中直接調用config的代碼。
注意model層中的代碼方法一定是`public` 類型。
通過 facade 實現靜態調用
定義門面類:
<?php
namespace app\facade;
use think\Facade;
class App extends Facade
{
protected static function getFacadeClass()
{
return 'app\common\model\App';
}
}
控制層調用方法如:
use app\facade\App;
$data = [];
App::config($data);
定義關聯關系 :
從屬關系
namespace app\common\model;
use think\Model;
class BackList extends Model
{
protected $pk = 'id';
protected $table = 'blacklist';
// 定義相對關聯
public function user()
{
return $this->belongsTo('User');
}
}
model層的業務邏輯如:
>[danger] 如數據庫操作支持表關聯,請定義好表與表之間的關聯關系。查尋可通過關聯直接獲取數據。