## 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 地址
## 简单示意图如下
![](https://box.kancloud.cn/d1feaec73eddc7d2835d7a61bee8828c_982x520.png)
以下为 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] 如数据库操作支持表关联,请定义好表与表之间的关联关系。查寻可通过关联直接获取数据。