[TOC] ## 继承关系 ![](https://img.kancloud.cn/72/61/7261684aa896193a9f810ccc87611dbd_1463x444.png) 上图是后台控制器的继承关系图: 1、woo\common\controller\Controller:整个系统的核心控制器,里面的属性和方法任何一个应用都可以调用到 2、woo\common\controller\AdminController:继承于1,整个系统的后台核心控制器,里面的属性和方法是每个后台控制器都可以调用到 3、app\common\controller\Admin:继承于2,作用和2一致;默认是空的,用于开发者定义自己的后台核心属性和方法 4、woo\admin\controller\XXXXXX:后台具体的业务控制器,它们继承于3;这些控制器都是系统自带的控制器,为了方便系统核心功能的升级,所以把系统自带的控制器单独抽离处理了;你可以理解为它们就是你正常开发的时候定义在app\admin\controller中的控制器,只是当app\admin\controller中控制器不存在的时候就会自动调用到woo\admin\controller中。 5、如果你希望扩展4中系统自带的具体控制器(比如你要改下Setting系统设置中的某个方法),你需要在app\admin\controller中定义一个类名一致的控制器,然后继承到4中的对应控制器 6、如果是你自定义的控制器,直接定义在app\admin\controller中然后继承于3 ![](https://img.kancloud.cn/f9/f5/f9f520e9c3873cf716564657a6af839e_688x424.png) 建议通过后台系统自带的控制器创建工具来创建我们的控制器,它会自动的识别来满足上面的继承规则。 > 需要你需要自定义的应用,建议在app\common\controller中定义一个整个应用的核心控制器,它应该继承于1。 ## 公共属性 ### 全局公共属性 ~~~ $request:当前请求实例 \woo\common\Request $app:当前应用实例 \think\App $assign:系统\woo\common\View实例,用于指定模板、模板赋值、添加CSS和JS文件等 $params:当前请求的参数,里面包含了当前请求的控制器名、应用名、方法名、url上的get参数等 $args:获取当前url上面的get参数 $middleware:控制器中间件 $mdl:当前控制器对应的同名模型实例(如果没有就为空) $mdlPk:当前控制器对应的同名模型的主键字段名 $local:一般用于控制器之间传递全局数据 $login:当前登录用户的相关信息(如果有登录) ~~~ 它们是定义在woo\common\controller\Controller中的,所有应用都可以访问的属性。 ### 后台公共属性 ~~~ $formPage:表单构建器实例,默认空 $table:表格构建器实例,默认空 $autoCreateFormActions:需要自动实例表单构建器的方法,默认是['create', 'modify'] $actionList:存储页面顶部按钮信息,一般不用直接操作该属性 ~~~ 它们是定义在woo\common\controller\AdminController中的,后台应用都可以访问的属性。 ## 公共方法 ### 全局公共方法 #### 初始化方法 `initialize` ~~~ protected function initialize() { // 你的代码可能在这里 parent::initialize(); //一定要调用父类方法 // 你的代码可能在这里 } ~~~ 里面可以定义一些,每次请求都希望执行的代码。一定要调用父类方法,系统很多核心代码也是在初始化中定义的。 该方法中不要重定向和return,确实需要拦截请求应该用中间件。 注意访问控制器尽量是`protected `,你自定义的方法如果不希望通过url直接请求到也应该是`protected`或`private`;只有能通过url请求的方法才`public`。 #### 信息提示 `message` ~~~ /** * 消息提示 * @param string $msg 消息 * @param string $type 类型 success error info warm * @param array $redirects 跳转连接 * @param int $auto 自动跳转 秒数 * @return string|\think\response\Json|\think\response\Redirect|void * @throws \Exception */ protected function message(string $msg = '',string $type = 'success', array $redirects = [],int $auto = 3) ~~~ ~~~ // 默认是sucess风格的提示 return $this->message('这里是提示消息内容'); // 其他风格的提示 //return $this->message('这里是提示消息内容', 'error');// 错误 //return $this->message('这里是提示消息内容', 'warm');// 警告 //return $this->message('这里是提示消息内容', 'info');// 普通 // 自动跳转时间 默认3秒 //return $this->message('这里是提示消息内容', 'info', [], 5); // 自定义跳转按钮和链接 //return $this->message('这里是提示消息内容', 'info', [ // '返回首页' => (string) url('Index/index'), // '测试' => (string) url('Index/index'), // '测试2' => ['url' => (string) url('Index/index'), 'class'=>'btn-3']// 通过类名自定义按钮样式 //]); // 默认一定会加上返回上一页的按钮 //return $this->message('这里是提示消息内容', 'info', ['back' => false], 5);// 取消返回上页按钮 //return $this->message('这里是提示消息内容', 'info', ['back' => false, '返回首页' => (string) url('Index/index')]);// 取消返回 同时自定义 //return $this->message('这里是提示消息内容', 'info', ['back' => ['title' => '返回', 'url' => (string) url('Index/index')]]);// 修改返回 标题和地址 //return $this->message('这里是提示消息内容', 'info', ['close' => true]);// 后台tab中 可以带一个关闭tab窗口的按钮 ~~~ 如果是ajax请求会自动调用下面的ajax方法返回一个json #### 重定向 `redirect` ~~~ protected function redirect($url) ~~~ #### 异步响应 `ajax`() ~~~ /** * json返回数据 * @param string $result * @param string $message * @param array $data * @return \think\response\Json */ protected function ajax($result = 'success', string $message = '', $data = []) { settype($data, 'array'); return json([ 'result' => $result, 'message' => $message, 'data' => $data ]); } ~~~ 你也可以直接用TP的json助手函数 #### jsonp响应 `jsonp` ~~~ /** * jsonp返回数据 * @param string $result * @param string $message * @param array $data * @return \think\response\Json */ protected function jsonp(string $result = 'error', string $message = '', $data = []) { settype($data, 'array'); return jsonp([ 'result' => $result, 'message' => $message, 'data' => $data ]); } ~~~ 你也可以直接用TP的jsonp助手函数 #### 追加一个网页标题`addTitle` ~~~ protected function addTitle($title) ~~~ #### 追加一个网站关键词 `addKeywords` ~~~ protected function addKeywords($title) ~~~ #### 追加一个网站描述 `addDescription` ~~~ protected function addDescription($title) ~~~ #### 重置网页标题 `setTitle` ~~~ protected function setTitle($title, $type = 'title') ~~~ #### 重置网站关键词 `setKeywords` ~~~ protected function setKeywords($title) ~~~ #### 重置网站描述 `setDescription` ~~~ protected function setDescription($title) ~~~ #### 模板定位 `fetch` ~~~ protected function fetch(string $tempate = '', array $vars = []) ~~~ #### 模板变量赋值 `assign` ~~~ protected function assign($name, $value = null) ~~~ ### 后台公共方法 后台每张表的CURD,应该创建一个和模型名一样的控制器名 #### 列表 `index` ~~~ public function index() ~~~ 后面章节,重点介绍 #### 添加 `create` ~~~ public function create() ~~~ 后面章节,重点介绍 #### 修改 `modify` ~~~ public function modify() ~~~ 后面章节,重点介绍 #### 删除 `delete` ~~~ public function delete() ~~~ 后面章节,重点介绍 #### 批量删除 `batchDelete` ~~~ public function batchDelete() ~~~ 后面章节,重点介绍 #### 排序 `sort` ~~~ public function sort() ~~~ 要使用系统自带的排序方案,你的数据表里面必须有`list_order`这个排序字段。 #### 详情 `detail` ~~~ public function detail() ~~~ 后面章节,重点介绍 #### 列表开关 `ajaxSwith` ~~~ public function ajaxSwitch() ~~~ 列表项模板设置为`checker`,自动完成该功能。 get请求接收三个参数: `field`:被修改的字段名 `id`:被修改数据的主键id值 `value`:被修改字段的值 可以通过`$this->local['where'][] = ['字段', '符号', '值'];`传递额外条件 #### 列表批量开关 `batchSwitch` ~~~ public function batchSwitch() ~~~ url参数(?field=xxx&value=xxx)上接收2个参数: `field`:被修改的字段名 `value`:被修改字段的值 post请求接收`selected_id`参数(数组):被修改数据的id集合 可以通过`$this->local['where'][] = ['字段', '符号', '值'];`传递额外条件 按钮举例: ~~~ [ 'name' => 's1', 'title' => '审核通过', 'sort' => 1, 'js_func' => 'woo_batch_switch', 'url' => (string)url('batchSwitch', ['field' => 'is_verify', 'value' => 1]) ] ~~~ 可以参考cms.Document模型 #### 回收站 `deleteIndex` ~~~ public function deleteIndex() ~~~ #### 恢复 `restore` ~~~ public function restore() ~~~ #### 批量恢复 `batchRestore` ~~~ public function batchRestore() ~~~ #### 真删除 `forceDelete` ~~~ public function forceDelete() ~~~ #### 批量真删除 `batchForeceDelete` ~~~ public function forceBatchDelete() ~~~ #### 添加一个顶部按钮 `addAction` ~~~ /** * 添加头部操作按钮 * * @param string $name 按钮标识 * @param string $title 标题 * @param string $url url * @param string $class 类名 * @param string $icon 图标 * @param int $sort 排序 任意数字 越大越前面 * @param bool|string $js_func 如果点击以后需要js执行业务 需要给一个 你自己js函数的名字 * @return $this */ protected function addAction( string $name, string $title = '', string $url = '' , string $class = '', string $icon = '', int $sort = 0, $js_func = false ) ~~~ 参考后文中[自定义页面](https://www.kancloud.cn/laowu199/e_dev/2052120)