当前位置 知且行 php 正文 下一篇:

laravel中间件middleware如何使用详细讲解

什么是中间件

可以简单地将中间件理解为请求与响应之间的中间人。用户发出一个路由请求,经过中间件的验证或过滤后,才能获取相应的响应内容。

定义中间件

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,
];

效果如下:

全局注册作用于所有路由,应用的场景比较少,毕竟开销太大

路由注册

只针对特定的路由起作用

首先在 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

浏览器访问: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";
    }
}

以上方法中,路由分组注册中间件最常用

源码库

转载必须注明出处:https://www.zhiqiexing.com/116.html

关于我

我希望能成为一个认真、有趣、创造更多价值的人
关注微信
微信扫一扫关注我

微信扫一扫关注我

返回顶部