【ThinkPHP6.x框架】(25)中间件
定义中间件
中间件的主要用于拦截和过滤 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';
上一篇: BeanUtils工具类
下一篇: Logback 日志管理配置
推荐阅读
-
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
-
laravel框架中间件简单使用方法示例
-
Laravel框架实现利用中间件进行操作日志记录功能
-
对于Node中Express框架的中间件概念的感知
-
laravel框架的中间件middleware的详解
-
我的第一个python web开发框架(25)——定制ORM(一)
-
java生态框架、中间件该有的都有了
-
Laravel5.1 框架Middleware中间件基本用法实例分析
-
SpingCloud(H版&alibaba)框架开发教程-25 OpenFeign服务调用、超时处理、日志增强
-
Laravel5.1框架注册中间件的三种场景详解