ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
##其他控制器 app\admin\controller\* 完美支持多级控制器,也完美支持多级控制器权限分配与校验,完美支持多级控制器的代码生成 ##继承 如果需要在控制器中是用权限校验,一定要继承公共控制器 `(app\admin\Controller)`,如果不需要权限校验,不用继承公共控制器,比如 `Generate` (代码自动生成控制器)、`Pub` (公开不授权控制器),如果需要继承公共控制器使用其方法但不想权限校验,请到extra目录下修改 `rbac.php` 里的配置信息 >[info] 继承公共控制器后仍然没有 add、edit、index等方法,需要引入 traits ,详情请看 [traits 多继承 Controller](225023) ##属性 和公共控制器一样,用来定义是否开启假删除和屏蔽不需要的方法 ``` // 黑名单方法,禁止访问某些方法 protected static $blacklist = []; // 是否删除标志,0-正常|1-删除|false-不包含该字段 protected static $isdelete = 0; ``` >[danger] 如果在控制器里不需要用到假删除,并且数据表中没有isdelete字段,一定要在控制器中将isdelete设为false,否则会导致报错 > 如果不需要使用相关方法,可以使用 protected static $blacklist = ['delete', 'deleteForever']; 对某些方法屏蔽 ##方法 ###前置方法 before 支持 本框架前置方法 before 支持写在公共控制器中,没有修改官方源码,使用方法请参考 [前置方法before支持](225018) ###过滤器 filter 用于 `index`、`recyclebin` 方法里过滤数据,**参数一定要使用取地址符&**,可以在此定义模糊查询,比如: ~~~ protected function filter(&$map) { if ($this->request->param('title')) { $map['title'] = ["like", "%" . $this->request->param('title') . "%"]; } if ($this->request->param('name')) { $map['name'] = ["like", "%" . $this->request->param('name') . "%"]; } } ~~~ 完美支持在过滤里定义关联查询,使用到关联查询时不需要重写index或其他相关方法,提高开发效率,使用关联查询时要定义 `$map['_relation'] = "关联的表名,不含表名前缀"`,请参考 [ThinkPHP5 - 关联预载入](http://www.kancloud.cn/manual/thinkphp5/139045) ,`$map['_relation']` 的值与 `with` 方法的值一样 `$map['_table'] = “当前表名,不含前缀"` 如果使用关联查询条件,要定义成 `$map['relation_table.field'] = '值'`,例如: ~~~ protected function filter(&$map) { if ($this->request->param('login_location')) { $map['login_location'] = ["like", "%" . $this->request->param('login_location') . "%"]; } // 关联筛选 if ($this->request->param('title')) { $map['title'] = ["like", "%" . $this->request->param('title') . "%"]; } if ($this->request->param('name')) { $map['name'] = ["like", "%" . $this->request->param('name') . "%"]; } // 设置属性 $map['_table'] = "login_log"; $map['_relation'] = "user"; $map['_order_by'] = "login_log.id desc"; } ~~~ ###ID 过滤器 filterId ID 过滤器用于过滤某些禁止操作的数据,通常和前置方法配合使用,例如: ``` /** * 禁用限制 */ protected function beforeForbid() { // 禁止禁用 Admin 模块,权限设置节点 $this->filterId(1, '该用户不能被禁用', '='); } ``` 其中 `filterId()` 方法的第三个参数 $method 可以设置成比较符号,也可以设置成回调函数,例如: ``` /** * 禁用限制 */ protected function beforeForbid() { // 禁止禁用 Admin 模块,权限设置节点 $this->filterId([1, 2, 3, 4, 5, 6], '该记录不能被禁用'); } ```