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;
    }
}

 

posted @ 2021-01-11 21:45  棉花糖88  阅读(55)  评论(0)    收藏  举报