什么是中间件
可以简单地将中间件理解为请求与响应之间的中间人。用户发出一个路由请求,经过中间件的验证或过滤后,才能获取相应的响应内容。
image定义中间件
laravel提供了定义中间件的指令,如定义一个获取当前时间的中间件
$ php artisan make:middleware GetCurrentTime
自动生成了 app/Http/Middleware/GetCurrentTime.php
文件
在 handle
方法中写具体的业务代码:
public function handle($request, Closure $next)
{
dump(date('Y-m-d H:i:s', time()));
return $next($request);
}
注册中间件
定义好的中间件需要进行注册才能使用,注册的方式有三种:
全局注册
即所有路由都必须经过此中间件
在 app/Http/Kernel.php
中的 $middleware
进行注册:
protected $middleware = [
# ...
\App\Http\Middleware\GetCurrentTime::class,
];
效果如下:
image全局注册作用于所有路由,应用的场景比较少,毕竟开销太大
路由注册
只针对特定的路由起作用
首先在 app/Http/Kernel.php
的 $routeMiddleware
中注册自定义的路由
protected $routeMiddleware = [
# ...
'get_current_time' => \App\Http\Middleware\GetCurrentTime::class,
];
然后在 routes/web.php
中将中间件绑定到指定的路由
Route::get('test', 'TestController@index')->name('test')->middleware('get_current_time')
创建TestController
:
$ php artisan make:controller TestController
image
浏览器访问:http://local.laravel-study.com/test
这种将中间件逐一绑定到路由的方式效率太低了,一般采用路由分组的方式进行绑定,格式如下:
Route::group(['middleware' => ['get_current_time']], function () {
Route::get('test', 'TestController@index')->name('test');
});
控制器中注册
去掉路由中的中间件绑定
Route::get('test', 'TestController@index')->name('test');
修改 app/Http/Controllers/TestController.php
代码:
class TestController extends Controller
{
public function __construct()
{
// 排除某些方法
// return $this->middleware(['get_current_time'])->except('index');
return $this->middleware(['get_current_time']);
}
public function index()
{
echo "test";
}
}
以上方法中,路由分组注册中间件最常用
网友评论