1、简介
HTTP中间件提供了一个便利的机制来过滤进入应用的HTTP请求。例如,Lumen包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就会允许请求继续往前进入下一步操作。
当然,除了认证之外,中间件还可以被用来处理更多其它任务。比如:CORS中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求。
所有中间件存放在 app/Http/Middleware 目录下。
2、定义中间件
要创建一个新的中间件,需要在新创建的中间件中重写handle方法。在下面中间件中,我们只允许提供的age大于200的访问路由,否则,我们将用户重定向到/home:
namespace AppHttpMiddleware;
use Closure;
class OldMiddleware
{
/**
* 返回请求过滤器
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('age') <= 200) {
return redirect('home');
}
return $next($request);
}
}
正如你所看到的,如果age<=200,中间件会返回一个HTTP重定向到客户端;否则,请求会被传递下去。将请求往下传递可以通过调用回调函数$next。
理解中间件的最好方式就是将中间件看做HTTP请求到达目标之前必须经过的“层”,每一层都会检查请求甚至会完全拒绝它。
2.1 中间件之前/之后
一个中间件是否请求前还是请求后执行取决于中间件本身。比如,以下中间件会在请求处理前执行一些任务:
namespace AppHttpMiddleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// 执行动作
return $next($request);
}
}
然而,下面这个中间件则会在请求处理后执行其任务:
namespace AppHttpMiddleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 执行动作
return $response;
}
}
3、注册中间件
3.1 全局中间件
如果你想要中间件在每一个HTTP请求期间被执行,只需要将相应中间件类放到bootstrap/app.php文件的$app->middleware()调用中即可:
$app->middleware([
AppHttpMiddlewareOldMiddleware::class
]);
3.2 分配中间件到路由
如果你想要分配中间件到指定路由,首先应该在bootstrap/app.php文件中分配给该中间件一个简写的key,默认情况下,$app->routeMiddleware()方法包含了Lumen自带的入口中间件,添加你自己的中间件只需要将其追加到后面并为其分配一个key:
$app->routeMiddleware([
'old' => 'AppHttpMiddlewareOldMiddleware',
]);
中间件在入口文件中被定义好了之后,可以在路由选项数组中使用middleware键来指定中间件:
$app->get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
使用数组可以为路由指定多个中间件:
$app->get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
4、中间件参数
中间件还可以接收额外的自定义参数,比如,如果应用需要在执行动作之前验证认证用户是否拥有指定的角色,可以创建一个RoleMiddleware来接收角色名作为额外参数。
额外的中间件参数会在$next参数之后传入中间件:
namespace AppHttpMiddleware;
use Closure;
class RoleMiddleware
{
/**
* 运行请求过滤器
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @param string $role
* @return mixed
* translator http://
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
中间件参数可以在定义路由时通过:分隔中间件名和参数名来指定,多个中间件参数可以通过逗号分隔:
$app->put('post/{id}', ['middleware' => 'role:editor', function ($id) {
//
}]);
5、终止中间件
有时候中间件可能需要在HTTP响应发送到浏览器之后做一些工作。比如,Lumen自带的“session”中间件会在响应发送到浏览器之后将session数据写到存储器中,为了实现这个,定义一个“终结者”中间件并添加terminate方法到这个中间件:
namespace IlluminateSessionMiddleware;
use Closure;
class StartSession
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// 存储session数据...
}
}
terminate方法将会接收请求和响应作为参数。一旦你定义了一个终结中间件,应该将其加入到 bootstrap/app.php 的全局中间件列表中。
在中间件上调用 terminate 方法时,Lumen 会从服务容器中解析一个该中间件的新实例,如果你想要在处理 handle 和terminate方法时使用同一个中间件实例,在容器中注册中间件时使用singleton方法即可。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔