2.7 中间件下
知识梳理
1 路由调用的中间件不用再 middleware中全局注册 直接调用就可以 支持调用多个中间件
2 路由中间件是全局的中间件
3 如果只想某个控制器只想中间件,可以用控制器中间件
一 路由中间件
1)控制器文件
<?php
namespace app\admin\controller;
class Index extends BaseController
{
public function hello($id=0){
return '参数id是'.$id;
}
}
2)定义中间件
<?php namespace app\admin\middleware; class Auth { public function handle($request,\Closure $next){ if ($request->param('id')==10) { echo '管理员'; } return $next($request); } }
如果参数id的值为10 就输出 管理员 三个字符
3)定义路由并调用中间件
//1 常规调用
<?php
use think\facade\Route;
Route::rule('fu/:id','Index/hello')->middleware(\app\admin\middleware\Auth::class)->middleware(\app\admin\middleware\Check::class);
//2 use引入中间件调用 <?php use app\admin\middleware\Check; use app\admin\middleware\Auth; use think\facade\Route; Route::rule('fu/:id','Index/hello')->middleware([Check::class,Auth::class]);
//3 别名调用 在config/middleware.php中添加别名 <?php // 中间件配置 return [ // 别名或分组 'alias' => [ 'check' => app\admin\middleware\Check::class, 'auth' => app\admin\middleware\Auth::class, ], // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行 'priority' => [], ]; //路由页面调用别名 <?php use think\facade\Route; Route::rule('fu/:id','Index/hello')->middleware(['check','auth']);
//4 直接使用闭包
<?php
use think\facade\Route;
Route::rule('fu/:id','Index/hello')->middleware(function($request,\Closure $next){
if ($request->param('id')==10) {
echo '管理员';
}
return $next($request);
});
4)参数传递
//1 路由向中间件传递参数 [第二个参数] <?php use think\facade\Route; use app\admin\middleware\Auth; Route::rule('fu/:id','Index/hello')->middleware(Auth::class,'fuyunlin');
//2 中间件接收参数 [ 第三个参数 ] <?php namespace app\admin\middleware; class Auth { public function handle($request,\Closure $next,$param){ if ($request->param('id')==10) { echo '管理员'.$param; } return $next($request); } }
5)支持路由分组
Route::group('ar', function () { Route::rule(':id', 'Address/read') })->middleware(Auth::class);
二 控制器中间件
1)整个类都会执行中间件
//添加$middleware属性
<?php
namespace app\admin\controller;
class Index
{
protected $middleware = [\app\admin\middleware\Check::class];
public function hello($id=0){
return '参数id是'.$id;
}
}
2)指定方法执行中间件
<?php
namespace app\admin\controller;
class Index
{
protected $middleware = [
'check' => ['only'=>['index']],//限定
'auth' => ['except'=>['hello']],//排除
];
public function hello($id=0){
return '参数id是'.$id;
}
public function index(){
return 'index首页';
}
}
3)中间件给控制器传递参数
//中间件 <?php namespace app\admin\middleware; class Check { public function handle($request,\Closure $next){ $request->name = 'fuyunlin'; //传递参数 return $next($request); } } //控制器 <?php namespace app\admin\controller; use app\Request; class Index { protected $middleware = ['check']; public function hello(Request $request,$id=0){ echo $request->name;//通过依赖注入获取 return '参数id是'.$id; } }

浙公网安备 33010602011771号