1. 程式人生 > >Laravel 5.5 的中介軟體

Laravel 5.5 的中介軟體

簡介

Laravel 的中介軟體提供了一種方便的機制來過濾進入應用的 HTTP 請求。例如,Laravel 內建了一箇中間件來驗證使用者的身份認證。如果使用者沒有通過身份認證,中介軟體會將使用者重定向到登入介面。但是,如果使用者被認證,中介軟體將允許該請求進一步進入該應用。

當然,除了身份認證以外,還可以編寫另外的中介軟體來執行各種任務。例如:CORS 中介軟體可以負責為所有離開應用的響應新增合適的頭部資訊;日誌中介軟體可以記錄所有傳入應用的請求。

Laravel 自帶了一些中介軟體,包括身份驗證、CSRF 保護等。所有這些中介軟體都位於 app/Http/Middleware 目錄。

定義中介軟體

執行 Artisan 命令 make:middleware 建立新的中介軟體:

php artisan make:middleware CheckAge

該命令將會在 app/Http/Middleware 目錄內新建一個 CheckAge 類。在這個中介軟體裡,我們僅允許提供的引數 age 大於 200 的請求訪問該路由。否則,我們會將使用者重定向到 home 。

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * 處理傳入的請求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param
\Closure $next * @return mixed */
public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } }

如你所見,若給定的 age 小於等於 200,那中介軟體將返回一個 HTTP 重定向到客戶端;否則,請求將進一步傳遞到應用中。要想讓請求繼續傳遞到應用程式中(即允許「通過」中介軟體驗證),只需使用 $request 作為引數去呼叫回撥函式 $next 。

最好將中介軟體想象為一系列 HTTP 請求必須經過才能觸發你應用的「層」。每一層都會檢查請求(是否符合某些條件),(如果不符合)甚至可以(在請求訪問你的應用之前)完全拒絕掉。

前置 & 後置中介軟體

中介軟體是在請求之前或之後執行取決於中介軟體本身。例如,以下的中介軟體會在應用處理請求 之前 執行一些任務:

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 執行動作

        return $next($request);
    }
}

而下面(這種寫法的)中介軟體會在應用處理請求 之後 執行其任務:

<?php

namespace App\Http\Middleware;

use Closure;

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

        // 執行動作

        return $response;
    }
}

註冊中介軟體

全域性中介軟體

如果你想讓中介軟體在你應用的每個 HTTP 請求期間執行,只需在 app/Http/Kernel.php 類中的 $middleware 屬性裡列出這個中介軟體類 。

為路由分配中介軟體

如果想為特殊的路由指定中介軟體,首先應該在 app/Http/Kernel.php 檔案內為該中介軟體指定一個 鍵。預設情況下,Kernel 類的 $routeMiddleware 屬性包含 Laravel 內建的中介軟體條目。要加入自定義的,只需把它附加到列表後併為其分配一個自定義 鍵 即可。例如:

//  App\Http\Kernel 類中

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

一旦在 Kernel 中定義了中介軟體,就可使用 middleware 方法將中介軟體分配給路由:

Route::get('admin/profile', function () {
    //
})->middleware('auth');

你還可以為路由分配多箇中間件:

Route::get('/', function () {
    //
})->middleware('first', 'second');

分配中介軟體時,你還可以傳遞完整的類名:

use App\Http\Middleware\CheckAge;

Route::get('admin/profile', function () {
    //
})->middleware(CheckAge::class);

中介軟體組

有時你可能想用單一的 鍵 為幾個中介軟體分組,使其更容易分配到路由。可以使用 Kernel 類的 $middlewareGroups 屬性來實現。

Laravel 自帶的 web 和 api 中介軟體組包含了你可能會應用到 Web UI 和 API 路由的常見的中介軟體:

/**
 * 應用程式的路由中介軟體組
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

可以使用與單箇中間件相同的語法將中介軟體組分配給路由和控制器操作。重申一遍,中介軟體組只是更方便地實現了一次為路由分配多箇中間件。

Route::get('/', function () {
    //
})->middleware('web');

Route::group(['middleware' => ['web']], function () {
    //
});

說明:無需任何操作,RouteServiceProvider 會自動將 web 中介軟體組應用於你的的 routes/web.php 檔案。

中介軟體引數

中介軟體也可以接受額外的引數。例如,如果應用需要在執行特定操作前驗證經過身份認證的使用者是否具備給定的「角色」,你可以新建一個 CheckRole 中介軟體,由它來接收「角色」名稱作為附加引數。

附加的中介軟體引數應該在 $next 引數之後被傳遞:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    /**
     * 處理傳入的請求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // 重定向...
        }

        return $next($request);
    }

}

定義路由時通過一個 : 來隔開中介軟體名稱和引數來指定中介軟體引數。多個引數就使用逗號分隔:

Route::put('post/{id}', function ($id) {
    //
})->middleware('role:editor');

Terminable 中介軟體

有時中介軟體可能需要在 HTTP 響應傳送到瀏覽器之後處理一些工作。比如,Laravel 內建的「session」中介軟體會在響應傳送到瀏覽器之後將會話資料寫入儲存器中。如果你在中介軟體中定義一個 terminate 方法,則會在響應傳送到瀏覽器後自動呼叫:

<?php

namespace Illuminate\Session\Middleware;

use Closure;

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

    public function terminate($request, $response)
    {
        // Store the session data...
    }
}

terminate 方法應該同時接收和響應。一旦定義了這個中介軟體,你應該將它新增到路由列表或 app/Http/Kernel.php 檔案的全域性中介軟體中。

在你的中介軟體上呼叫 terminate 呼叫時,Laravel 會從 服務容器 中解析出一個新的中介軟體例項。如果要在呼叫 handle 和 terminate 方法時使用同一個中介軟體例項,就使用容器的 singleton 方法向容器註冊中介軟體。

相關推薦

Laravel 5.5中介軟體

簡介Laravel 的中介軟體提供了一種方便的機制來過濾進入應用的 HTTP 請求。例如,Laravel 內建了一箇中間件來驗證使用者的身份認證。如果使用者沒有通過身份認證,中介軟體會將使用者重定向到登入介面。但是,如果使用者被認證,中介軟體將允許該請求進一步進入該應用。當然

Scrapy——5 下載中介軟體常用函式、scrapy怎麼對接selenium、常用的Setting內建設定有哪些

Scrapy——5   下載中介軟體常用的函式 Scrapy怎樣對接selenium 常用的setting內建設定   (Downloader Middleware)下載中介軟體常用函式有哪些  Scrapy怎樣對接Selenium 設定

ASP.NET Core應用針對靜態檔案請求的處理[5]: DefaultFilesMiddleware中介軟體如何顯示預設頁面

DefaultFilesMiddleware中介軟體的目的在於將目標目錄下的預設檔案作為響應內容。我們知道,如果直接請求的就是這個預設檔案,那麼前面介紹的StaticFileMiddleware中介軟體會將這個檔案響應給客戶端。如果我們能夠將針對目錄的請求重定向到這個預設檔案上,一切就迎刃而解了。實際上Def

Laravel 三種中介軟體作用講解

昨天在開發過程中,需要使用到中介軟體的技術,之前都只是簡單的認為要增加中介軟體就往middleware裡新增中介軟體即可。本著週末的時間,就仔細研究了下 $middleware $middlewareGroup $routeMiddleware三個屬性,到底是怎麼樣用的,通過查閱文件和網上資料,可算

Laravel ——路由(中介軟體與路由組)

我們知道,路由是一個過程,分析來自客戶端的請求按照路由規則分發至相應的處理邏輯。但有種情況,打個比方:後臺。後臺不是所有人都能訪問的,我們在正式的處理邏輯前,需要做一個驗證,比如驗證是否具有許可權或者請求的資料是否合法。 這時候,路由過程的一部分——中介軟體就上場了。

laravel路由、中介軟體、控制器等簡單筆記

1.基本路由 - http://laravelacademy.org/post/398.html get() post() put() patch() delete() options() match() - ['get', 'post'] any() -

Laravel摘記之中介軟體與驗證碼的使用

中介軟體 中介軟體作為請求和響應之間的中間人。它是一種過濾機制型別。例如,Laravel包括一箇中間件用來驗證應用程式的使用者認證與否。如果使用者通過驗證,它將被重定向到主頁,否則將被重定向到登入頁面。 中介軟體可以通過執行以下命令來建立,所有的中介軟體都位

PHP進階5 裝飾者模式在Laravel中介軟體的應用

                    不積跬步無以至千里不積小流無以成江海 裝飾者模式是在開放-關閉原則下實現動態新增或者減少功能的一種方式,類似於洋蔥,分很多層,每一層都有一定的功能,可以

Laravel 5.5 跨域 中介軟體

Laravel 5.5中介軟體跨域訪問 做api介面的時候碰到個問題,跨域! 解決方法有很多,但是方便的依舊那麼一兩個。 第一種,最方便的,新建一個middleWare,把這個middleware加入到全域性中介軟體,所有的請求,都會經過這個中介軟體

資料庫路由中介軟體MyCat - 原始碼篇(5

此文已由作者張鎬薪授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 3. 連線模組 如之前所述,MyCat的連線分為前端和後端,下面是連線基本相關類圖: 3.1 ClosableConnection: public interface Closa

Django框架的中介軟體5種用法和邏輯

一、什麼是中介軟體? 官方的說法:中介軟體是一個用來處理Django的請求和響應的框架級別的鉤子。它是一個輕量、低級別的外掛系統,用於在全域性範圍內改變Django的輸入和輸出。 每個中介軟體元件都負責做一些特定的功能。但是由於其影響的是全域性,所以需要謹慎使用,使用不當會影響效能。 說

學習ASP.NET Core, 怎能不瞭解請求處理管道[5]: 中介軟體註冊可以除了可以使用Startup之外,還可以選擇StartupFilter

中介軟體的註冊除了可以藉助Startup物件(DelegateStartup或者ConventionBasedStartup)來完成之外,也可以利用另一個叫做StartupFilter的物件來實現。所謂的StartupFilter是對所有實現了IStartupFilter介面的型別及其物件的統稱。IStart

AgileEAS.NET SOA 中介軟體平臺5.2版本下載、配置學習(一):下載平臺並基於直連環境執行

一、前言      AgileEAS.NET SOA 中介軟體平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(元件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。      A

AgileEAS.NET SOA 中介軟體平臺5.2版本下載、配置學習(四):開源的Silverlight執行容器的編譯、配置

一、前言      AgileEAS.NET SOA 中介軟體平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(元件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。      A

爬蟲2.5-scrapy框架-下載中介軟體

目錄 scrapy框架-下載中介軟體 scrapy框架-下載中介軟體 middlewares.py中有兩個類,一個是xxSpiderMiddleware類 一個是xxDownloaderMiddleware類,xx代表專案名,本次筆記主要記錄DownloaderMiddleware類的一些知識

Java訊息中介軟體ActiveMQ-5.11.1啟動失敗解決辦法

異常資訊: Exception thrown from LifecycleProcessor on context close | org.apache.activemq.xbean.XBeanBrokerFactory$1 | WrapperSimpleAppMain j

從零一起學koa2(5)---koa-bodyparser中介軟體

上一篇中寫了如何直接編寫程式碼接收並解析POST請求,比較麻煩,這種比較麻煩的事情一定有中介軟體讓我們使用,koa-bodyparser就是一個。對於POST請求的處理,koa-bodyparser中介軟體可以把koa2上下文的formData資料解析到ctx.

Laravel5.5原始碼詳解 -- Auth中介軟體

Laravel5.5原始碼詳解 – Auth中介軟體 為了體現全貌,前面的程式碼部分沒有做太多刪減,重點關注特別加入的註釋部分。原文的註釋刪除,以減少閱讀篇幅。本文重點在後面的流程講解,這些比較詳細。 如果光看官方的文件,碰到問題的時候往往還是不知所云。所以

nodejs+mongodb系列教程之(3/5)--理解路由和中介軟體

    一、路由 路由是指如何定義應用的端點(URIs)以及如何響應客戶端的請求。 路由是由一個 URI、HTTP 請求(GET、POST等)和若干個控制代碼組成,它的結構如下: app.METHOD(path, [callback...], callback),app 是

ASP.NET Core靜態檔案中介軟體[5]: DirectoryBrowserMiddleware & DefaultFilesMiddleware

對於NuGet包由“Microsoft.AspNetCore.StaticFiles”提供的3箇中間件來說,StaticFileMiddleware中介軟體旨在處理針對具體靜態檔案的請求,其他兩個中介軟體(DirectoryBrowserMiddleware和DefaultFilesMiddleware)處理