欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【ThinkPHP6.x框架】(25)中间件

程序员文章站 2022-04-25 20:09:45
...

定义中间件

        中间件的主要用于拦截和过滤  HTTP请求,并进行相应处理,这些请求的功能可以是  URL重定向、权限验证等等。为了进一步了解中间件的用法,我们首先定义一个基础的中间件,可以通过命令行模式,在应用目录下生成一个中间件文件和文件夹:

php think make:middleware Check
namespace app\middleware; class Check
{
    public function handle($request, \Closure $next) {
        if ($request->param('name') == 'index') { 
            return redirect('../');
    }
        return $next($request); 
    }
}

      然后将这个中间件进行注册,在应用目录下创建middleware.php中间件配置:

return [
    app\middleware\Check::class 
];

        中间件的入口执行方法必须是:handle()方法,第一参数请求,第二参数是闭包。业务代码判断请求的name如果等于index,就拦截住,执行中间件,跳转到首页;但如果请求的name是lee,那需要继续往下执行才行,不能被拦死,那么就需要$next($request)把这个请求去调用回调函数。
中间件handle()方法规定需要返回response对象,才能正常使用。而$next($request)执行后,就是返回的response对象。为了测试拦截后,无法继续执行,可以return response()助手函数测试。

前/后置中间件

        将$next($request)放在方法底部的方式,属于前置中间件;前置中间件就是请求阶段来进行拦截验证,比如登录判断、跳转、权限等;而后置中间件就是请求完毕之后再进行验证,比如写入日志等等。

public function handle($request, \Closure $next)
{
    //中间件代码,前置 
    return $next($request);
}

public function handle($request, \Closure $next) {
    $response = $next($request); 
    //中间件代码,后置
    return $response; 
}

结束调度

        中间件提供了一个end()方法,可以在中间件执行到最后时执行:

public function end(Response $response)
{
    //中间件执行到最后执行 
    echo $response->getData();
}

路由中间件

        创建一个给路由使用的中间件,判断路由的ID值实现相应的验证:

class Auth {
    public function handle($request, \Closure $next) {
        if ($request->param('id') == 10) { 
            echo '是管理员!';
        }
        return $next($request); 
    }
}

        路由方法提供了一个middleware()方法,让指定的路由采用指定的中间件:

Route::rule('ar/:id', 'Address/read')
    ->middleware(\app\middleware\Auth::class);
    ->middleware([Auth::class, Check::class]);  //支持多个中间件,这里  use了

        也可以在config/middleware.php配置文件加中,配置别名支持:

'alias'   => [
    'Auth' => app\middleware\Auth::class, 
    'Check' => app\middleware\Check::class,
],
->middleware(['Auth', 'Check']);

        可以给中间件传递额外参数,通过中间件入口方法的第三个参数接收:

->middleware(Auth::class, 'ok');
public function handle($request, \Closure $next, $param, $param = '')

        中间件也支持分组路由,闭包路由等。

Route::group('ar', function () {
    Route::rule(':id', 'Address/read') 
})->middleware(Auth::class);

Route::rule('ar/:id', 'Address/read')
    ->middleware(function ($request, \Closure $next) {
        if ($request->param('id') == 10) {
            echo '是管理员!'; 
        }
        return $next($request); 
});

控制器中间件

        可以让中间件在控制器里注册,让这个控制器执行的时候执行中间件:

protected $middleware = ['Check'];

        默认情况下,控制器中间件对所有操作方法有效,支持做限制:

protected $middleware = [
    'Auth' => ['only' =>['index']], 
    'Check' => ['except' =>['read']],
];

        中间件给控制器传递参数,通过Request对象实现:

 $request->name = 'Mr.Lee';