中间件整理

分享: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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!