ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 官方文档: https://www.kancloud.cn/manual/thinkphp5_1/564279 # 输入命令生成中间件 ~~~ php think make:middleware Check ~~~ ![](https://img.kancloud.cn/ef/fb/effbcb3156bc9912f1d980ea1860dc0e_2096x985.png) ![](https://img.kancloud.cn/b8/ac/b8ac67b81c36d11ba26be1ec9b6a910c_2319x944.png) # 注册中间件: # 在application里新键一个`middleware.php`文件 ## 代码: ~~~ <?php return[ app\http\middleware\Check::class //注册中间件 到应用目录 ]; ~~~ ## 一般用于登陆的时候,如果哪个路由需要就单独设置哪个路由 ![](https://img.kancloud.cn/b6/c8/b6c8d5d6a7d8604003b8ace1480802b8_1009x294.png) ![](https://img.kancloud.cn/d1/24/d124ab3406cc4f99a45a97a2a8a9f7d6_2579x1169.png) ## 中间件里返回对象包(一个完整的中间件框架就是以下图片所展示代码) ![](https://img.kancloud.cn/1e/92/1e92b3a6a8ce88a51f44790729590b43_3007x1164.png) ~~~ <?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next) //入口 这里一般不要改变触发改源代码 \Closure 为匿名函数 { echo '123'; return $next($request); //返回request闭包 固定格式写到这里 } } ~~~ # 中间件里的$request可以拦截所有来自路由的参数 进行判断或者处理 ![](https://img.kancloud.cn/03/5d/035d3b60c8087745969707146c653fd2_2912x1498.png) # 代码案例: ~~~ <?php namespace app\http\middleware; use think\Request; class Check { public function handle(Request $request, \Closure $next) //入口 这里一般不要改变触发改源代码 \Closure 为匿名函数 { //这个区域做逻辑判断,判断跳转到哪里或者怎么样 if($request->param('id')==100){ return redirect('/index'); }elseif($request->param('id')==500){ return redirect('/es'); } //这个区域做逻辑判断,判断跳转到哪里或者怎么样 return $next($request); //返回request闭包 固定格式写到这里 } } ~~~ # 路由里的参数: ![](https://img.kancloud.cn/83/41/83414e684ef4c5b9bce980b028d3337d_1789x756.png) ~~~ <?php Route::get('index/[:id]','index/index/index'); //传入值 Route::get('es','index/index/es'); ~~~ # 注意: ## 中间件的入口执行方法必须是`handle`方法,而且第一个参数是`Request`对象,第二个参数是一个闭包。 # 路由中注册: ## 注册中间件 ### 路由中间件 ## 最常用的中间件注册方式是注册路由中间件 ~~~ Route::rule('hello/:name','hello') ->middleware('Auth'); ~~~ ## 或者使用完整的中间件类名 ~~~ Route::rule('hello/:name','hello') ->middleware(app\http\middleware\Auth::class); ~~~ ## 支持注册多个中间件 ~~~ Route::rule('hello/:name','hello') ->middleware(['Auth', 'Check']); ~~~ ## `V5.1.7+`版本,你可以直接在应用配置目录下的`middleware.php`中先预定义中间件(其实就是增加别名标识),例如: ## ~~~ return [ 'auth' => app\http\middleware\Auth::class, 'check' => app\http\middleware\Check::class ]; ~~~ ## 然后直接在路由中使用中间件别名注册 ~~~ Route::rule('hello/:name','hello') ->middleware(['auth', 'check']); ~~~ ## `V5.1.8+`版本开始,可以支持使用别名定义一组中间件,例如: ~~~ return [ 'check' => [ app\http\middleware\Auth::class, app\http\middleware\Check::class ], ]; ~~~ ## 然后,直接使用下面的方式注册中间件 ~~~ Route::rule('hello/:name','hello') ->middleware('check'); ~~~ ## 支持对路由分组注册中间件 ~~~ Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware('Auth'); ~~~ ## `V5.1.8+`版本开始支持对某个域名注册中间件 ~~~ Route::domain('admin', function(){ // 注册域名下的路由规则 })->middleware('Auth'); ~~~ 如果需要传入额外参数给中间件,可以使用 ~~~ Route::rule('hello/:name','hello') ->middleware('Auth:admin'); ~~~ 如果使用的是常量方式定义,可以在第二个参数传入中间件参数。 ~~~ Route::rule('hello/:name','hello') ->middleware(Auth::class, 'admin'); ~~~ 如果需要定义多个中间件,使用数组方式 ~~~ Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check']); ~~~ 可以统一传入同一个额外参数 ~~~ Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check'], 'admin'); ~~~ 复制 或者单独指定中间件参数。 ~~~ Route::rule('hello/:name','hello') ->middleware(['Auth:admin', 'Check:editor']); ~~~