中间件整理

分享:Laravel 三种中间件作用讲解

中间件#

当一个用户发起请求时:
中间件前置 (需要处理的逻辑) -> 执行的方法 -> 中间件后置 (对响应数据的处理后并返回相应数据)

使用流程#

创建一个中间件 (app/Http/Middleware)

php artisan make:middleware CheckAge
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
    // 处理传入的请求
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            // 如果age小于200重定向到home页面
            return redirect('home');
        }
        // 只有前置操作直接 return $next($request);
        // 进入下一个应用层,并将$request传给下一个应用层
        // return $next($request);
        // 个人觉得后置操作还不如直接使用terminate方法
        // 前置+后置的操作
        // 获取执行的$next($request)的响应数据。
        $response = $next($request);
        // 处理响应数据,最后返回响应数据
        $response->setContent('ddd');
        return $response;
    }
    // 注意最后响应结果时ddd
    public function terminate($request, $response){
        $response->setContent('ccc');
        return $response;
    }
}

注册中间件
app/Http/Kernel.php
注册中间件的类型有三种
$middleware 全局中间件,$routeMiddleware 为指定路由分配的中间件,$middlewareGroups 中间组 (就是将多个中间件组合成一个件)

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class
    ];
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class
        ],
        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];
    protected $routeMiddleware = [
        'check' => \App\Http\Middleware\CheckAge::class,
        'test' => \App\Http\Middleware\TestMiddleware::class,
    ];
}

为路由指定中间件(全局中间件不需要指定路由)

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
Route::get('/y20210405',function(Request $request){
    return 'aaaa';
})->middleware('check');
Route::get('/test',function(Request $request){
    return 'aaaa';
})->middleware('web');
// 通过类名的形式指定
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
    //
})->middleware(CheckAge::class);
// withoutMiddleware删除指定中间件
Route::middleware([CheckAge::class])->group(function () {
    Route::get('/', function () {
        //
    });
    Route::get('admin/profile', function () {
        //
    })->withoutMiddleware([CheckAge::class]);
});

其他待续

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。