TYPE_NAMES
TYPE_NAMES = [1 => '目录', 2 => '页面', 3 => '外链', 4 => '容器']
菜单维护服务
职责:菜单的创建、更新、删除、树构建等核心逻辑集中在此, Controller 只负责参数接收和响应返回;用户菜单按直授角色授权过滤。
┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 构造与依赖 __construct 分区 2 · 查询(读) tree / userTree / collectDescendantIds 分区 3 · 菜单写操作 create / update / destroy 分区 4 · 内部辅助 normalizeEmptyStrings / clearAllUserMenusCache / buildTree buildFromGroup / userTreeQuery / buildAuthorizedMenuTree buildMenuNode / collectAncestorIds / validateTypeLevel validateChildType / validateTypeChange / validateParentChange └────────────────────────────────────────────────────────────┘
$cacheService : \App\Services\Admin\PermissionCacheService
normalizeStringColumns(array<string,mixed> $data, string[] $columns, array<string,string> $defaults = [], bool $fillMissing = false) : array
字符串列归一化:值为 null 的键写入 $defaults 对应默认值(缺省 '')。
| array |
$data | 待写库数据(按引用字段处理,返回归一化副本) |
| string[] | $columns | 参与归一化的列名 |
| array |
$defaults | 列 => 默认值(缺省 '',如 link_target => '_self') |
| bool | $fillMissing | true 时缺失键也补默认值(创建路径全字段落库用);false 只处理已存在的键 |
buildFromGroup(\Illuminate\Support\Collection $grouped, int $parentId) : \Illuminate\Support\Collection
内存递归组树:全量按 parent_id 分组,逐层拼 children,零额外查询。 返回 Collection——setRelation 的 children 必须是 Arrayable(数组会在模型 toArray 时被丢弃)。
| \Illuminate\Support\Collection | $grouped | |
| int | $parentId |