* @Date: 2026-04-29 02:32:33 * @LastEditors: YwxApp * @LastEditTime: 2026-09-28 00:00:00 * @Description: 权限节点(backend_power)校验 * @FilePath: \ywxapp_dev\app\backend\validate\Power.php * @CustomString: Copyright (c) 2026 YwxApp */ declare(strict_types=1); namespace app\backend\validate; use think\Validate; use ywxapp\model\BackendPower; /** * Power 校验器 * * 控制器 Power::save() / update() 会 validate(Power::class), * 此前该校验器缺失 ⇒ 新增 / 编辑权限节点直接报类不存在。 * * 关于 route:type=1 目录 与 type=5 分组标题 不需要路由(分组标题只作侧边栏视觉分组), * 故不做 require,仅限制长度。 * * @author ywxapp */ class Power extends Validate { protected $rule = [ 'title' => 'require|max:50', 'name' => 'require|max:100', 'type' => 'require|checkType', 'pid' => 'number', 'route' => 'max:100', 'icon' => 'max:100', 'sort' => 'number', 'status' => 'in:0,1', ]; protected $message = [ 'title.require' => '节点名称不能为空', 'title.max' => '节点名称不能超过50个字符', 'name.require' => '节点标识不能为空', 'name.max' => '节点标识不能超过100个字符', 'type.require' => '请选择节点类型', 'type.checkType' => '节点类型只能是 目录/菜单/按钮/API/分组标题', 'pid.number' => '上级节点不正确', 'route.max' => '路由不能超过100个字符', 'icon.max' => '图标类名不能超过100个字符', 'sort.number' => '排序必须是数字', 'status.in' => '状态值不正确', ]; /** * 更新场景:必须带 id */ public function sceneUpdate() { return $this->append('id', 'require|number'); } /** * 类型必须是已定义的类型(与 BackendPower 常量保持同步) */ public function checkType($value, $rule, $data = []): bool|string { $allowed = [ BackendPower::TYPE_DIR, BackendPower::TYPE_MENU, BackendPower::TYPE_BUTTON, BackendPower::TYPE_API, BackendPower::TYPE_GROUP_TITLE, ]; return in_array((int) $value, $allowed, true) ?: '节点类型不正确'; } }