Laravel中間件

Laravel中間件提供了一種新的方法來處理HTTP請求,這種方法有助於保持應用程序的可維護性和可擴展性,使開發人員能夠專註於業務邏輯而不是處理請求的細節。接下來我們將從多個方面來詳細闡述Laravel中間件。

一、中間件的基本概念

中間件可以看做是在請求到達控制器之前或之後執行的代碼。它們提供了一種方法來處理請求的細節,例如身份驗證、日誌記錄和請求過濾。這些中間件獨立於控制器、路由和請求處理流程,並可以被應用於多個路由和控制器。

在Laravel中,中間件可以由全局中間件、路由中間件和基於控制器的中間件組成。全局中間件可以用於整個應用程序,路由中間件可以用於特定的路由,基於控制器的中間件可以用於特定的控制器。

下面是一個簡單的中間件例子:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age < 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

在這個例子中,我們定義了一個CheckAge中間件,會判斷來到的請求中是否帶有age參數,如果沒有或小於18,會進行重定向,否則就通過中間件繼續處理。

二、路由中的中間件

我們可以在路由中使用中間件,來在控制器處理請求前執行代碼,例如驗證用戶的身份、授權到訪問等。在Laravel中,路由中的中間件可以在中間鍵數組中指定。

可以使用路由名稱綁定中間件,這樣可以方便的在修改路由時不用修改中間件信息,如下:

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

可以使用數組綁定多個中間件:

Route::get('admin/profile', ['middleware' => ['first', 'second'], function () {
    //
}]);

也可以在路由實例上使用middleware方法來綁定中間件:

$route->middleware('auth');

三、全局中間件

全局中間件會對每一個通過應用程序的請求都進行處理。這使得開發人員可以輕鬆地添加由框架提供的功能,如響應壓縮和HTTPS重定向。Laravel已經默認為你定義了很多中間件,你可以在app/Http/Kernel.php找到它們。

你可以在Kernel.php 中的$middleware屬性中註冊全局中間件:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    // ...
];

你也可以在Kernel.php中的 $middlewareGroups 屬性中註冊中間件組。Laravel默認有web和api兩個中間件組。

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // ...
    ],

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

四、基於控制器的中間件

除了路由中的中間件外,Laravel還提供了可以在控制器中使用的中間件。這些中間件可以讓你在特定控制器之前或之後對請求進行過濾或處理。

可以將中間件應用於控制器,例如:

namespace App\Http\Controllers;

use App\Http\Middleware\CheckAge;

class UserController extends Controller
{
    /**
     * Instantiate a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(CheckAge::class);
    }
}

在這個例子中,我們使用了剛才定義的CheckAge中間件來檢查用戶的年齡。我們在UserController的構造函數中調用了middleware方法,傳遞一個CheckAge實例作為參數。從而將中間件應用於這個控制器。

五、中間件的優先順序

路由中間件、全局中間件的優先順序可以在應用程序的核心中間件管理器(app/Http/Kernel.php)中指定,這使開發人員可以管理它們的中間件執行順序。當多個中間件被應用到同一個請求時,這些中間件將按照它們在應用程序的核心中間件管理器中定義的順序被調用。

protected $middlewarePriority = [
    \Illuminate\Auth\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\Routing\Middleware\ThrottleRequests::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    // ...
];

六、自定義中間件

當Laravel默認提供的中間件無法滿足您的需求時,您可以輕鬆地創建自己的中間件。Laravel使創建中間件變得非常容易,只需執行命令即可:

php artisan make:middleware CheckAge

這將在app/Http/Middleware目錄下創建匿名CheckAge PHP類。Laravel幫助您執行所有基本的類安裝,讓您可以立即開始編寫中間件的代碼。在handle方法中實現這個中間件:

public function handle($request, Closure $next)
{
    if ($request->age < 18) {
        return redirect('home');
    }

    return $next($request);
}

你也可以在constructor中注入剛才定義的CheckAge中間件:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function handle($request, Closure $next)
    {
        if ($this->request->age < 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

完整的自定義中間件例子:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function handle($request, Closure $next)
    {
        if ($this->request->age < 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

七、總結

本文詳細闡述了Laravel中間件的概念、路由中間件、全局中間件、基於控制器的中間件、中間件的優先順序和自定義中間件。中間件提供了一種新的方法來處理HTTP請求,使得開發更加便捷和可維護。

原創文章,作者:ANGT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131671.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ANGT的頭像ANGT
上一篇 2024-10-03 23:47
下一篇 2024-10-03 23:47

相關推薦

  • Laravel任務調度的探討

    一、任務調度簡介 任務調度是指在應用程序中預定、計劃和執行任務的過程。Laravel任務調度器提供了一種友好的方式來註冊定期運行的任務,而不需要藉助操作系統的Cron語法。任務調度…

    編程 2025-04-22
  • Web中間件的詳細闡述

    一、中間件概述 中間件是一種軟體模式,位於傳統客戶端和伺服器之間。它可以處理HTTP請求、響應和中轉,同時還可以提供各種服務和安全機制。中間件可以提高應用程序的性能、可伸縮性和可靠…

    編程 2025-04-20
  • Laravel漏洞詳解

    Laravel是PHP開發中一款十分熱門的開發框架,它在便捷性、擴展性以及功能上都有著不錯的表現。作為開發者,在使用Laravel時需要關注它的安全性,因為Laravel也存在漏洞…

    編程 2025-04-12
  • Laravel JWT:基於JWT的Laravel身份驗證和授權

    Laravel JWT是一個基於JWT(JSON Web Token)的Laravel身份驗證和授權包。JWT作為一種輕量級的身份驗證和授權解決方案,在Web應用程序中越來越受歡迎…

    編程 2025-04-12
  • Redis中間件詳解

    一、Redis及其應用場景 Redis是一個快速、開源、多數據結構的鍵值緩存資料庫,支持複製、內存持久化和高可用性。Redis可用於緩存、發布/訂閱、實時分析、排行榜和計數器的應用…

    編程 2025-02-24
  • Laravel Cache詳解

    一、Cache概述 Laravel為開發者提供了強大的緩存支持,同時支持多種緩存器,如文件緩存器、memcached緩存器、redis緩存器等等。通過使用Laravel的緩存功能可…

    編程 2025-02-24
  • Easynetq:面向消息的輕量級消息中間件

    一、簡介 Easynetq是一個面向消息的輕量級消息中間件,在.net平台下提供高性能,可靠的消息通訊能力。 它是RabbitMQ的一個封裝,使得使用RabbitMQ變得更加容易和…

    編程 2025-02-05
  • 中間件的作用

    中間件指的是位於客戶端和伺服器之間,實現數據交互的軟體組件。中間件可以協同不同的系統進行交互、數據傳輸,並且負責處理數據、控制數據的流動和安全性驗證。中間件在軟體系統中擔任著重要的…

    編程 2025-02-01
  • 全面了解SpigotMC——最受歡迎的Minecraft服務端中間件

    作為Minecraft平台上最受歡迎的服務端其一,SpigotMC已經陪伴了許多玩家和開發者走過了很長的一段路。在這篇文章中,我們將從不同的角度來詳細地介紹SpigotMC,讓您全…

    編程 2025-01-16
  • 關於php大道至簡之laravel的信息

    本文目錄一覽: 1、php中laravel和mvc是什麼意思 2、什麼是 Laravel ? 3、為什麼 Laravel 會成為最成功最流行的 PHP 框架 4、為什麼Larave…

    編程 2025-01-14

發表回復

登錄後才能評論