中间件 Middleware
路由中间件
中间件:当程序接收HTTP请求时,拦截后进行过滤和处理
创建一个check中间件
bash
php artisan make:middleware Check
实现一个简单的登录身份验证的效果
首先创建一个Login控制器
php
class LoginController
{
public function index()
{
echo '管理员,您好!';
}
public function login()
{
echo '登录失败!';
}
}
php
Route::get('/admin','LoginController@index');
Route::get('/login','LoginController@login');
要求,当Http接受id=1
的情况下,它就是管理员,跳转index否则login
php
//固定方法,固定格式
public function handle($request, Closure $next) {
//这里编写验证跳转方法
if ($request->get('id') != 1) {
return redirect(url('/login'));
}
// 固定返回格式,让其继续往下执行
return $next($request);
}
注册中间件
php
// Http/Kernel.php
protected $routeMiddleware = [
'check'=>\App\Http\Middleware\Check::class,
]
执行中间件
php
// 这种中间件,属于前置中间件
Route::get('/admin','LoginController@index')
->middleware('check');
- 前置中间件:先拦截 Http 请求,再执行主体代码
- 后置中间件:先执行主体代码,再拦截处理;
php
// 固定方法,固定格式
public function handle($request, Closure $next) {
//先执行主体代码
$response = $next($request);
//再进行拦截 Http 请求处理 echo '我是后置中间件';
//固定格式返回
return $response;
}
中间件进阶
设置多个中间件
php
->middleware('check', 'auth');
没有在配置中注册中间件,采用完整的类名来进行调用
php
->middleware(\App\Http\Middleware\Check::class);
全局中间件,每次执行都必然调用
php
protected $middleware = [
\App\Http\Middleware\Every::class,
]
中间件的核心方法可以有第三个参数,可以在控制器调用时传递
php
public function handle($request, Closure $next, $param);
->middleware('check:abc');
中间件组,如果有一些需要固定调用多个中间件,我们可以将它群组
php
protected $middlewareGroups = [
'mymd' => [
'check'=>\App\Http\Middleware\Check::class,
]
];
中间件的terminate()方法,可以在中间件响应完之后(return$next)再调用
php
public function terminate($request, $response)
{
echo '<br>Http响应完毕之后再调用我';
}
中间件也可以在控制器的构造方法里调用,这里注意错误跳转会死循环;
php
public function __construct()
{
$this->middleware('check:abc');
}