ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
>[warning] 节点管理比较复杂,请仔细看 ## 分清模块、控制器、多级控制器、方法的概念 ### 模块(module) 模块指的是 ThinkPHP5 里面的 `module` ,即是 `application` 文件夹下用于区分业务的文件夹,例如 `admin`,`index`,这些都是模块,在链接中,它就是最靠近域名(标准部署模式,网站根目录指向项目的 `public` 文件夹)的一个字符串,例如 `http://tpadmin.yuan1994.com/admin` ,该链接中 `admin` 就是模块,在节点管理中,模块都是根节点,可以有多个根节点,即多个模块,但是,***一定要把控制器和方法节点都放在该根节点下*** ### 控制器(controller)和多级控制器 控制器指的是你在模块下的 `controller` 文件夹新建的类,该类可能在 `controller` 根目录下或者 `controller` 的某个子目录下,例如在 `controller` 的根目录下有个 `AdminGroup` 的控制器,那么通过 `$request->controller()` 请求获取的到的控制器就是 `AdminGroup`,在链接里就是 `admin_group`(被格式成小写,非首字母大写会在前面追加一个下划线 `_`),如果在 `controller` 的子目录 `mp` 下有个 `UserTag` 的控制器,那么通过 `$request->controller()` 请求获取的到的控制器就是 `mp.UserTag`,在链接里就是 `mp.user_tag`(被格式成小写,非首字母大写会在前面追加一个下划线 `_`),这个就是 ThinkPHP5 的新特性,详情请参考 [ThinkPHP5 - 多级控制器](http://www.kancloud.cn/manual/thinkphp5/118054),***一定要弄懂多级控制器的概念,否则你就老老实实用普通控制器(一级控制器),不然的话,权限管理你永远都走不通*** >[info] 一级控制器直接添加到该模块节点下面,多级控制器可以多层添加,也可以使用点语法添加节点,例如 `one.two.ThreeFour` 可以将 `one` 添加到 `admin` 节点下,然后 `two` 添加到 `one` 节点下面,`ThreeFour` 添加到 `two` 节点下,或者直接将 `one.two.ThreeFour` 添加到 `admin` 节点下 > >[warning] 为了安全,请严格注意控制器名的大小写 ### 方法(action) 方法指的控制器下的方法,该方法的访问属性必须为 `public`,在添加节点时必须添加到该控制器的下面,不区分大小写 ## 添加节点 后台左侧导航菜单都是节点,只有顶层进行分类的是分组,所以添加节点就是添加菜单,如果节点添加错误会导致菜单不出来,也会导致权限管理失败,其他帐号访问该节点可能出现权限错误的问题,请严格注意节点的大小写 >[warning] 为了减少左侧菜单渲染时 SQL 查询,菜单渲染时强制要求根节点不能为未分组,请任意选择根节点为一个分组,不会将根节点渲染到任何一个分组的,否则会导致后台没有菜单,只能去数据库修改数据才能恢复 如果直接点击头部的 `添加` 按钮,添加的节点将是根节点,即模块级别 如果是选中某个节点(包括点击选中或复选框选中)或者在该节点上右键添加节点,添加的节点是该选中节点的子节点 > 如果是复选框选中节点后添加,并且有多个节点被选中,添加的节点是最上面被选中节点的子节点,该选中节点的判断优先级规则是 `右键添加 > 点击选中添加 > 复选框选中添加 > 多个复选框选中第一个元素` 添加节点时选择分组,如果选择未分组,菜单将不会显示,如果该节点的某个父节点为未分组也不会显示,如果该节点或该节点的父节点被禁用也不会显示,如果某个用户的权限里没有可显示的菜单,该用户登录到管理后台会报无权限错误,请保证该用户有菜单显示 选择节点分组时,分组只会对二级节点,即根节点(模块级别)下节点进行分组,假如你的某个二级节点选择的是 `系统管理` 分组,它下面的某个节点是 `示例分组` ,那么该节点菜单只会显示在他父级节点的下面,即它还是属于 `系统管理` 分组 如果你给某个控制器节点下面添加了子节点,即是方法级别的节点,请务必选择该节点类型为 `方法` ,否则会在 `控制器` 类型的节点后面自动追加 `index` 方法 如果你添加了某个控制器节点,并且该节点下你也添加了方法节点,但是显示为菜单时该控制器节点却没有变成你希望的链接菜单,下面会出现方法节点的菜单,此时你可以尝试将这些方法节点的分组给选择为未分组 如果你想把某个方法直接放在分组下当为一级菜单,你可以这样添加 `Demo/upload` ,这样该菜单就能直接在对应分组下找到该菜单,对于多级控制器,你也可以使用这种方法,例如根节点下添加节点 `one.two.ThreeFour/add` ,这种形式的节点我称之为 `高阶节点`,完美支持多级节点管理 ## 公共节点 公共节点的名称在配置文件里的 `common_auth_name` 里,默认为 `common` 如果你想对所有的一级控制器下的 `add` 方法开放授权,你不必非常麻烦的把这些节点一个一个的勾选,然后保存,此时你可以在根节点下添加一个 `common` 节点,然后在 `common` 下添加一个 `add` 节点,然后对该节点授权,其他的一级控制器下的 `add` 节点都有权限了,即一个公共节点可以统筹所有和它同级别的节点,该 `common` 节点可以添加在任何地方,该公共节点下的节点就有统筹作用 ## 批量导入 为了让添加节点不成为一个很头疼的问题,你可以使用批量导入功能,不过批量导入功能只能扫描该节点对应控制器下的方法,并且所有访问属性为 `public` 的方法(包括从 traits 继承的方法)并且排除 `$blacklist` 里的黑名单方法的所有方法,如果你选中的该节点不是一个有效的控制器,那么当前类下不会出现任何方法,该扫描出的节点的名称是方法名,节点的标题是该方法的注释,注释格式必须按照下面的格式进行注释(可以不要返回值): ``` /** * 下载文件 */ public function download() { if ($this->request->param('file')) { return \File::download("../README.md"); } else { return $this->view->fetch(); } } ``` 如果没有注释,该节点的标题为未定义 >[info] 由于版本遗留问题,公共控制器不再有访问属性为 `public` 的方法,全部移至 traits 中,所以会公共类中没有节点,如果你在公共类中添加了访问属性为 `public` 的方法,就会扫描出来 ## 节点排序 只有节点的分组为一个明确分组而不是未分组时,节点的排序才有意义,因为只有此时节点才能渲染成菜单,节点的排序是排序值越小越靠前 v1.2 版本优化了节点管理,支持树形节点管理,需要排序节点直接拖拽就行,拖拽的节点如果是当前节点组的第一个,那么它的排序值为 0,如果是其他,那么是前一个节点的排序值 +1,所以假如你给多个节点设置了相同的排序值,拖拽排序可能会出现排序值计算错误的,你可以选择编辑节点手动输入排序值 拖拽也同时可以自己调整节点层次,很方便的对节点层次进行管理 ## 演示示例 以下演示全部都是在根节点 `admin` 下 ### 菜单下节点未分组,仅作权限管理(最常用) ![](https://box.kancloud.cn/b3479549c75ee3015d620f548153d330_590x172.png) 显示效果: ![](https://box.kancloud.cn/d458e9e19fbf35ebc2e68c2d7f01ff3e_199x245.png) 菜单链接:`admin/admin_group/index.html` ### 控制器下添加节点 ![](https://box.kancloud.cn/d30071b24ac675b214462e1f877eb86f_621x384.png) 显示效果: ![](https://box.kancloud.cn/79732a774db8b9361c4ba6c7baaff3e0_216x85.png) 菜单链接:`admin/controller/action.html` ### 多级控制器多级菜单节点 ![](https://box.kancloud.cn/2c1bb1b7e3c65af9032ade3f42411d50_574x175.png) 显示效果: ![](https://box.kancloud.cn/01c0475d1fd4f98159cbadc649b17fb5_260x170.png) 菜单链接:`admin/one.two.three_four/index.html` > 节点最后一级是控制器,所以自动添加 `index` 默认方法 ### 控制器默认方法 ![](https://box.kancloud.cn/72d67bcf3603a681b06715d1c1b7d91a_620x98.png) 显示效果: ![](https://box.kancloud.cn/508388030f17a3a19bf91703cdf56452_188x181.png) 菜单链接:`admin/controller2/index` > 节点最后一级是控制器,所以自动添加 `index` 默认方法 ### 多级控制器默认方法 ![](https://box.kancloud.cn/5359cfcfbfb72cb016c005bf1879b909_627x151.png) 显示效果: ![](https://box.kancloud.cn/80e78c921262bd867316b602b7432bdf_187x191.png) 菜单链接:`admin/one.two.three_four/index.html` > 节点最后一级是控制器,所以自动添加 `index` 默认方法 ### 多级控制器指定方法 ![](https://box.kancloud.cn/8df15db6fdedb09c9d9031c53a99a465_689x119.png) 显示效果: ![](https://box.kancloud.cn/cb3d33ab579383afbcf57473b8867603_181x183.png) 菜单链接:`admin/one.two.three.four/add.html` >[info] 以上演示几乎包含了所有可能添加节点的方法,如果你开发是还是出现问题,请自己慢慢检查,学会调试,很快就能找到问题所在的,上面的各种情况都测试过没有问题