middleware中间件
是访问到达服务器后在被对应的路由处理之前所经过的一层过滤层,故称中间件。
中间件是存放在app\http\middleware中,需要定一个 handle 处理方法,在handle中当处理完后,可以进行重定向,也可以使用 $next() 闭包函数执行之前的业务逻辑操作
第一步 使用artisan生成中间件
php artisan make:middleware testMiddleware
生成app\http\middleware\testMiddleware.php中间件
<?php namespace App\Http\Middleware; use Closure; class testMiddleware
{
中间件默认包含两个参数包含请求信息的$request和闭包函数$next
$next可以继续执行之前的逻辑操作
$request包含请求的信息
public function handle($request, Closure $next)
{
// 处理请求
//执行业务操作
return $next($request);
}
}
中间件可以加入其他参数
<?php namespace App\Http\Middleware; use Closure; class RoleMiddleware
{
public function handle($request, Closure $next, $parameter)
{
当age大于18时将参数写入文本
if($request -> input('age') > 18)
{
file_put_contents('testMiddlewareHandle.txt', $parameter);
}
return $next($request);
}
}
其他中间件参数需要使用 : 来分割 多个参数应当用逗号隔开
Route::get('testMiddleware/{id}', ['middleware' => 'TestMiddleware:this is MiddlewareValue',
function($id){
file_put_contents('testRoute.txt', $id);
}]);
当访问testMiddle时会经过中间件TestMiddlewarephp中的handle函数处理,函数中的$parameter被赋值
'this is MiddlewareValue'
除了middleware属性指定中间件,也可使用middleware链式指定中间件
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
链式方法
Route::get('/', function () {
//
}])->middleware(['first', 'second']);
当访问http://localhost/testMiddleware/Route?age=19,public目录下会生成两个文件分别为testRoute.txt和testMiddlewareHandle.txt
第二步 注册中间件
设计好中间件后需要注册中间件,可以在 app\http\kernel.php 中注册全局的中间件$middleware
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
也可以注册局部路由中间件
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'test' => \App\Http\Middleware\TestMiddleware::class,
];
中间件处理顺序及可终止中间件
对于一个请求,需要中间件进行其他的操作和对其处理,可以在操作之前或者之后进行处理
可以在$next()之前或者之后进行处理业务逻辑也可以 redirect() -> route('route')进行重定向
public function handle($request, Closure $next)
{ if (condition) {
// 执行动作
} $response = $next($request);
请求处理 if (condition) {
// 执行动作
} return $response;
}
可终止中间件
可以终止中间件是在相应已经结束之后进行的操作,加上一个 terminate 方法,
terminate方法含有两个参数:$request $response, 当使用可终止中间件需要将其注册进$middleware中
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\TestMiddleware::class,
];
<?php namespace App\Http\Middleware; use Closure; class RoleMiddleware
{
public function handle($request, Closure $next)
{
....
return $next($request);
} public function terminate($request, $response)
{
file_put_contents("resuest.txt", $request);
file_put_contents("response.txt", $response);
} }
对于任何的请求都会执行terminat方法,也不要指定路由的中间层为 全局中间层 不然会报错 class not exist