如何基于ThinkPHP注解实现自定义路由注解权限控制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1079个文字,预计阅读时间需要5分钟。
ThinkPHP 8 的官方中间件(如 `@Middleware`)主要负责绑定中间件,不解析业务逻辑——它只是将请求丢给中间件后,就不再关心了。权限判断必须由你写的中间件自行完成,注解只是起到开关的作用。
常见错误是以为加了 @Middleware("CheckPermission") 就自动读取方法上的 @Permission("user:delete") 并校验,其实框架压根不识别后者。你需要手动扩展注解解析能力。
实操建议:
- 用
think-annotation扩展包(官方推荐)加载自定义注解类,别自己手写反射解析 - 自定义注解类必须继承
think\annotation\Annotation,且命名需匹配(如Permission对应@Permission) - 注解类的
handle()方法里不能做权限检查,只该收集元数据(如权限码、是否忽略),检查逻辑留在中间件里
如何让 @Permission("order:pay") 在路由执行前生效?
关键在「时机」:注解信息必须在控制器方法被调用前拿到,而 ThinkPHP 的路由调度链是「路由匹配 → 中间件执行 → 控制器调用」。所以得在中间件里反查当前路由绑定的控制器方法,并读取其注解。
本文共计1079个文字,预计阅读时间需要5分钟。
ThinkPHP 8 的官方中间件(如 `@Middleware`)主要负责绑定中间件,不解析业务逻辑——它只是将请求丢给中间件后,就不再关心了。权限判断必须由你写的中间件自行完成,注解只是起到开关的作用。
常见错误是以为加了 @Middleware("CheckPermission") 就自动读取方法上的 @Permission("user:delete") 并校验,其实框架压根不识别后者。你需要手动扩展注解解析能力。
实操建议:
- 用
think-annotation扩展包(官方推荐)加载自定义注解类,别自己手写反射解析 - 自定义注解类必须继承
think\annotation\Annotation,且命名需匹配(如Permission对应@Permission) - 注解类的
handle()方法里不能做权限检查,只该收集元数据(如权限码、是否忽略),检查逻辑留在中间件里
如何让 @Permission("order:pay") 在路由执行前生效?
关键在「时机」:注解信息必须在控制器方法被调用前拿到,而 ThinkPHP 的路由调度链是「路由匹配 → 中间件执行 → 控制器调用」。所以得在中间件里反查当前路由绑定的控制器方法,并读取其注解。

