MVC框架

# MVC框架

MVC是一种设计模式。它强制性的使用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型(Model)、视图(View)、控制器(Controller),它们各自处理自己的任务。

# 控制器

控制器存放在addons/addon_name/controller中类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。 应用的控制器与Tp6系统的使用方法一直,具体可以参考Thinkphp6控制器 (opens new window)

# 目录结构

addon_name
 └── controller // 控制器 继承不同的控制器可以实现不同的功能
     ├── admin // 自定义目录
     │   ├── Index.php
     ├── api
     │   └── Index.php
     ├── h5
     │   └── Index.php
     ├── Admin.php
     └── Index.php
1
2
3
4
5
6
7
8
9
10

# 控制器定义

应用中定义控制器生成:yourdomain.com/addon_name/index/index.html或者yourdomain.com/addon_name.html示例:

<?php
namespace addons\addon_name\controller;
use think\addons\Controller;
//use app\common\controller\AddonsController; 二选一

class Index extends Controller
{
    public $notLogin = ['*'];

    public function index()
    {
        return "这是addon_name应用Index控制器的index方法";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

当前文件位于:根目录/addons/addon_name/controller/Index.php

# 控制器目录

当遇到复杂的业务逻辑时,往往需要把相同的业务单独放到文件夹中。

这时候应用的Url请求将变为:yourdomain.com/addon_name/目录名.控制器名/方法

# 控制器继承属性

注意

这里继承的控制器Controller也可以选择app\common\controller\AddonsController;,因为think\addons\Controller也是继承它。

继承后将实现权限管理、应用方法等

    //登录
    protected $notLogin = [];
    
    //鉴权
    protected $notCheck = [];

    //获取插件信息
    public function getInfo(){}

    //获取配置信息
    public function getConfig($type = false){}

    //获取插件标识
    protected function getName(){}

    //生成应用路由,默认会根据平台ID生成带有平台ID的链接
    public function url($controller, $action = 'index', $vars = []){}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 方法权限

填写不需要登录的方法,如protected $notLogin =['index','list']

如果整个控制器都不需要可以填写protected $notLogin =['*']或者protected $notLogin ='*'

$notCheck和$notLogin属性同理,这里就不细说了

# 模型

# 使用规范

控制器不能直接调用数据库操作,所有的数据库操作必须在model层中编写,model中类的命名要规范,按照功能进行划分:

# 命名规范

获取单条数据命名:get+要获取的数据+Info 比如获取用户数据 getUserInfo

获取多条数据: get+要获取的数据+List 比如获取用户数据 getUserList

获取分页数据: get+要获取的数据+PageList 比如获取用户列表 getUserPageList

添加数据 : add+要添加的表 比如添加用户 addUser

修改数据 : edit+要修改的表 比如修改用户 editUser

删除数据:delete+要删除的表 比如删除用户 deleteUser

通过某种方式获取或者修改数据,要获取数据+By+方式 例如获取用户插件 getUserAddonListByUid

修改表的某个字段: modify+修改的表+字段 修改用户昵称,modifyUserNickname

查询列表参数标准 :getSiteList($condition = [], $field = '*', $order = '', $limit = null)

查询分页列表标准 getSitePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')

查询单条数据标准 getSiteInfo($condition, $field = '*')

添加方法传入data 例如: addUser($data)

添加多条记录方法传入data 例如: addUserList($data)

修改方法传入data, condition 例如 editUser($data, $condition)

删除方法传入condition 例如 deleteUser($condition)

# 内置方法

同时已经我们已经在BaseModel中封装了条件查询获取分页列表方法:

/**
 * 获取分页列表查询条件
 * @param $search
 * @return array
 */
public function getPageListCondition($search = []){}

/**
 * 获取分页列表条件模型
 * @param array $params 前端条件
 * @param bool $paginate 是否分页
 * @return BaseModel
 */
public function getPageListModel($params = [], $paginate = true){}

/**
 * 获取分页列表数据
 * @param array $params
 * @return \think\Collection
 */
public function getPageListData($mix = [], $params = []){}

/**
 * 获取分页列表总数
 * @param array $params
 * @return int
 */
public function getPageListCount($mix = [], $params = []){}

/**
 * 获取分页列表
 * @param array $mix
 * @param array $params
 * @return array
 */
public function getPageList($mix = [], $params = []){}

/**
 * 混入参数到模型中
 * @param $model
 * @param array $mix
 * @return mixed
 */
public function mixPageListModel($model, $mix = []){}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# 方法示例

当你继承了BaseModel后就可以直接使用对应的方法,例如:app/adminapi/controller/v1/platform/wechat/WechatOrder.php 中获取订单列表

    /**
     * 显示资源列表
     * @Route("WechatUser", method="GET")
     * @return \think\Response
     */
    public function index()
    {
        $res = $this->model->getPageList(['scope'=>'plaid']);
        return $this->success($res['count'], $res['data']->append(['user','addons','refund']));
    }
1
2
3
4
5
6
7
8
9
10

其中筛选条件可以通过POST请求传入search参数,search参数是一个数组格式如下:

$search = array(
    'state'         => 1,
    'username like' => '多客',
    'create_time' => [
        0=>1638244800000,
        1=>1641312000000
    ]
);
1
2
3
4
5
6
7
8

这样就实现搜索state等于1,模糊搜索username多客,并有一个创建日期范围

# 图示

例如

# 视图

# 目录结构

视图存放于addons/addon_name/view

addon_name
    └── view // 控制器 继承不同的控制器可以实现不同的功能
        ├── admin 
        │   └── index.html
        ├── h5
        │   └── index.html
        └── admin.html
1
2
3
4
5
6
7

# 使用

在控制器中想指定view/index.html这可以使用:

public function index()
{
    $this->assign('value', $value);
    return $this->fetch('index');
}
1
2
3
4
5

由于视图和Tp6的视图没任何区别,

视图可以自行参考:https://www.kancloud.cn/manual/thinkphp6_0/1037608 (opens new window)

模板语法可以参考:https://www.kancloud.cn/manual/think-template/1286403 (opens new window)