国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Lumen HTTP 中間件

2021-09-15 14:39 更新

1、簡(jiǎn)介

HTTP中間件提供了一個(gè)便利的機(jī)制來(lái)過(guò)濾進(jìn)入應(yīng)用的HTTP請(qǐng)求。例如,Lumen包含了一個(gè)中間件來(lái)驗(yàn)證用戶是否經(jīng)過(guò)授權(quán),如果用戶沒(méi)有經(jīng)過(guò)授權(quán),中間件會(huì)將用戶重定向到登錄頁(yè)面,否則如果用戶經(jīng)過(guò)授權(quán),中間件就會(huì)允許請(qǐng)求繼續(xù)往前進(jìn)入下一步操作。

當(dāng)然,除了認(rèn)證之外,中間件還可以被用來(lái)處理更多其它任務(wù)。比如:CORS中間件可以用于為離開站點(diǎn)的響應(yīng)添加合適的頭(跨域);日志中間件可以記錄所有進(jìn)入站點(diǎn)的請(qǐng)求。

2、定義中間件

中間件通常都放在app/Http/Middleware目錄下。想要?jiǎng)?chuàng)建一個(gè)新的中間件,需要在新創(chuàng)建的中間件中重寫handle方法。在下面中間件中,我們只允許提供的age大于200的訪問(wèn)路由,否則,我們將用戶重定向到主頁(yè):

<?php

namespace App\Http\Middleware;

use Closure;

class OldMiddleware
{
    /**
     * 返回請(qǐng)求過(guò)濾器
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->input('age') <= 200) {
            return redirect('home');
        }

        return $next($request);
    }

}

正如你所看到的,如果age<=200,中間件會(huì)返回一個(gè)HTTP重定向到客戶端;否則,請(qǐng)求會(huì)被傳遞下去。將請(qǐng)求往下傳遞可以通過(guò)調(diào)用回調(diào)函數(shù)$next。

理解中間件的最好方式就是將中間件看做HTTP請(qǐng)求到達(dá)目標(biāo)之前必須經(jīng)過(guò)的“層”,每一層都會(huì)檢查請(qǐng)求甚至?xí)耆芙^它。

2.1 中間件之前/之后

一個(gè)中間件是否請(qǐng)求前還是請(qǐng)求后執(zhí)行取決于中間件本身。比如,以下中間件會(huì)在請(qǐng)求處理前執(zhí)行一些任務(wù):

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 執(zhí)行動(dòng)作

        return $next($request);
    }
}

然而,下面這個(gè)中間件則會(huì)在請(qǐng)求處理后執(zhí)行其任務(wù):

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 執(zhí)行動(dòng)作

        return $response;
    }
}

3、注冊(cè)中間件

3.1 全局中間件

如果你想要中間件在每一個(gè)HTTP請(qǐng)求期間被執(zhí)行,只需要將相應(yīng)中間件類放到bootstrap/app.php文件的$app->middleware()調(diào)用中即可。

3.2 分配中間件到路由

如果你想要分配中間件到指定路由,首先應(yīng)該在bootstrap/app.php文件中分配給該中間件一個(gè)簡(jiǎn)寫的key,默認(rèn)情況下,$app->routeMiddleware()方法包含了Lumen自帶的入口中間件,添加你自己的中間件只需要將其追加到后面并為其分配一個(gè)key:

$app->routeMiddleware([
    'old' => 'App\Http\Middleware\OldMiddleware',]);

中間件在入口文件中被定義好了之后,可以在路由選項(xiàng)數(shù)組中使用middleware鍵來(lái)指定中間件:

$app->get('admin/profile', ['middleware' => 'auth', function () {
    //
}]);

4、中間件參數(shù)

中間件還可以接收額外的自定義參數(shù),比如,如果應(yīng)用需要在執(zhí)行動(dòng)作之前驗(yàn)證認(rèn)證用戶是否擁有指定的角色,可以創(chuàng)建一個(gè)RoleMiddleware來(lái)接收角色名作為額外參數(shù)。

額外的中間件參數(shù)會(huì)在$next參數(shù)之后傳入中間件:

<?php

namespace App\Http\Middleware;

use Closure;

class RoleMiddleware
{
    /**
     * 運(yùn)行請(qǐng)求過(guò)濾器
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     * translator http://laravelacademy.org
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

中間件參數(shù)可以在定義路由時(shí)通過(guò):分隔中間件名和參數(shù)名來(lái)指定,多個(gè)中間件參數(shù)可以通過(guò)逗號(hào)分隔:

$app->put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);

5、中止中間件

有時(shí)候中間件可能需要在HTTP響應(yīng)發(fā)送到瀏覽器之后做一些工作。比如,Lumen自帶的“session”中間件會(huì)在響應(yīng)發(fā)送到瀏覽器之后將session數(shù)據(jù)寫到存儲(chǔ)器中,為了實(shí)現(xiàn)這個(gè),定義一個(gè)“終結(jié)者”中間件并添加terminate方法到這個(gè)中間件:

<?php

namespace Illuminate\Session\Middleware;

use Closure;

class StartSession
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // 存儲(chǔ)session數(shù)據(jù)...
    }
}

terminate方法將會(huì)接收請(qǐng)求和響應(yīng)作為參數(shù)。一旦你定義了一個(gè)終結(jié)中間件,應(yīng)該將其加入到入口文件的全局中間件列表中。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)