ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## Interceptor:前置拦截器 可以配置多组拦截器对访问进行拦截,访问在真正到达控制器前会按顺序经过 Interceptor,可以做一些权限,用户身份识别等代码 配置 ~~~ 'interceptors'=>[ \cloud\CloudInterceptor::class, \cloud\mag\MagInterceptor::class, \cloud\security\SecurityInterceptor::class ], 'interceptors_except'=>['/log'] //需要排除的路径前缀 ~~~ 拦截器需要实现Interceptor接口 如 ~~~ class SecurityInterceptor implements Interceptor{ /** * @var CloudApi */ private $api; public function _initialize(CloudApi $api) { $this -> api = $api; } public function handler(Request $request, Response $response) { return false; } } ~~~ ### 返回结果 如果拦截器可以处理请求,不需要继续向下传递,可以直接返回结果,返回结果的方法和控制器的返回结果的方法相同 ~~~ 如 return ['success'=>true]; return body('文本内容'); ~~~ 如果拦截器需要继续向下传递 可以不写 return 或 return false; ## AfterInterceptor:后置拦截器 如果你还需要在控制器处理完成后添加统一逻辑可以实现该接口 源码中 RequestCacheInterceptor就是同时实现了Interceptor和AfterInterceptor两个接口 ## 通过代码添加拦截器 $application->addInterceptor(类名,优先级) ~~~ public function appInit(AutoFindHandlerMapping $autoMapping, Router $router) { /* @var $application Application */ $application = Ioc::get(Application::class); $application->addInterceptor(SecurityInterceptor::class,99); } ~~~ ## 拦截器优先级 1. 配置文件中配置的优先级都是 100,按配置循序执行 2. 你可以通过代码加入拦截器并设置优先级 3. 最后拦截器的执行顺序是按优先级排序的 越小的越先执行