搜尋
首頁後端開發php教程掌握 Laravel 中間件的基礎知識

掌握 Laravel 中间件的基础知识

在本文中,我們將深入探討 Laravel 框架,以了解中介軟體的概念。本文的前半部首先介紹中間件及其實際用途。

#隨著我們繼續,我們將介紹如何在 Laravel 應用程式中建立自訂中間件。建立自訂中間件後,我們將探索可用於將其註冊到 Laravel 的選項,以便可以在請求處理流程中實際呼叫它。

我希望您認為自己熟悉基本的 Laravel 概念和用於生成腳手架程式碼的 Artisan 命令列工具。當然,最新 Laravel 應用程式的有效安裝可讓您立即運行本文中提供的範例。

Laravel 中的中間件是什麼?

我們可以將中間件視為一種機制,讓您可以連接到 Laravel 應用程式的典型請求處理流程。典型的 Laravel 路由處理會經歷請求處理的某些階段,而中間件是應用程式必須經過的層之一。

那麼掛鉤 Laravel 請求處理流程到底有什麼意義呢?想一想需要在應用程式引導的早期階段執行的事情。例如,需要在早期對使用者進行身份驗證,以決定是否允許他們存取目前路由。

我能想到的一些可以透過中間件實現的事情是:

  • 記錄請求
  • 重定向使用者
  • 更改/清理傳入參數
  • 操縱 Laravel 應用程式產生的回應
  • 還有更多

事實上,預設的 Laravel 應用程式已經附帶了一些重要的中間件。例如,有中間件可以檢查網站是否處於維護模式。另一方面,有中間件來清理輸入請求參數。正如我前面提到的,使用者認證也是透過中間件本身來實現的。

我希望到目前為止的解釋可以幫助您對中間件這個術語更有信心。如果您仍然感到困惑,請不要擔心,因為我們將從下一節開始建立自訂中間件,這將幫助您準確地理解如何在現實世界中使用中間件。

如何建立自訂中間件

在本節中,我們將建立自訂中間件。但我們的自訂中間件到底要完成什麼任務呢?

最近,我遇到了客戶的自訂要求,如果使用者從任何行動裝置造訪網站,他們應該被重定向到相應的子網域 URL,並且所有查詢字串參數保持不變。我相信這是演示如何在這個特定場景中使用 Laravel 中間件的完美用例。

在這種情況下我們想要使用中間件的原因是需要掛鉤應用程式的請求流。在我們的自訂中間件中,我們將檢查用戶代理,如果用戶使用行動設備,則他們將被重定向到相應的行動 URL。

討論完所有理論後,讓我們開始實際開發,這是理解新概念的最佳方式,不是嗎?

身為 Laravel 開發人員,如果您希望建立任何自訂功能,您最終將在大部分時間使用 Artisan 工具來建立基本範本程式碼。讓我們用它為我們的自訂中間件建立基本模板程式碼。

轉到命令列並轉到專案的文檔根目錄。執行以下命令建立自訂中間件範本 MobileRedirect

php artisan make:middleware MobileRedirect

這應該使用以下程式碼建立一個檔案 app/Http/Middleware/MobileRedirect.php

<?php
 
namespace App\Http\Middleware;
 
use Closure;
 
class MobileRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

您通常會注意到 handle 方法的實現,該方法充當中間件的主幹,並且您要實現的中間件的主要邏輯應該位於此處.

藉此機會介紹Laravel自備的中間件類型。主要有前中介軟體和後中介軟體兩種。

顧名思義,before 中間件是在實際處理請求和建置回應之前運行的中間件。另一方面,後中間件在應用程式處理請求之後運行,並且此時已經建構了回應。

在我們的例子中,我們需要在處理請求之前重定向用戶,因此它將被開發為前置中間件。

繼續並使用以下內容修改檔案 app/Http/Middleware/MobileRedirect.php

<?php
 
namespace App\Http\Middleware;
 
use Closure;
 
class MobileRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // check if the request is from mobile device
        if ($request->mobile == "1") {
            return redirect('mobile-site-url-goes-here');
        }
 
        return $next($request);
    }
}

為了簡單起見,我們只檢查mobile 查詢字串參數是否存在,如果將其設定為TRUE,則使用者將被重定向到對應的行動裝置網站網址。當然,如果您希望即時檢測,您會希望使用用戶代理檢測庫。

此外,您還希望將 mobile-site-url-goes-here 路由替換為正確的路由或 URL,因為它只是用於演示目的的佔位符。

按照我们的自定义逻辑,调用 $next($request) 允许在应用程序链中进一步处理请求。在我们的例子中需要注意的重要一点是,我们将移动检测逻辑放置在 $next($request) 调用之前,有效地使其成为一个 before 中间件。

这样,我们的自定义中间件就几乎准备好进行测试了。目前,Laravel 无法了解我们的中间件。为此,您需要向 Laravel 应用程序注册您的中间件,这正是我们下一节的主题。

在进入下一部分之前,我想演示一下后中间件的外观,以防万一有人对此感到好奇。

<?php
 
namespace App\Http\Middleware;
 
use Closure;
 
class CustomMiddleWare
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        
        /* your custom logic goes here */
        
        return $response;
    }
}

正如您已经注意到的,中间件的自定义逻辑在 Laravel 应用程序处理请求后执行。此时,您还可以访问 $response 对象,如果您愿意,它允许您操作它的某些方面。

这就是 after 中间件的故事。

我们的自定义中间件正在运行

本节描述了向 Laravel 应用程序注册中间件的过程,以便在请求处理流程中实际调用它。

继续打开文件 app/Http/Kernel.php 并查找以下代码片段。

/**
 * The application's global HTTP middleware stack.
 *
 * These middleware are run during every request to your application.
 *
 * @var array
 */
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

如您所见,$middleware 保存了 Laravel 默认安装附带的中间件数组。此处列出的中间件将根据每个 Laravel 请求执行,因此它是放置我们自己的自定义中间件的理想选择。

继续添加我们的自定义中间件,如以下代码片段所示。

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

现在,尝试使用查询字符串 mobile=1 访问任何 Laravel 路由,这应该会触发我们的中间件代码!

这就是您应该注册需要在每个请求上运行的中间件的方式。但是,有时您希望仅针对特定路由运行中间件。让我们检查一下如何使用 $routeMiddleware 来实现这一点。

在我们当前示例的上下文中,我们假设如果用户访问您网站上的任何特定路由,他们将被重定向到移动网站。在这种情况下,您不想将中间件包含在 $middleware 列表中。

相反,您希望将中间件直接附加到路由定义,如下所示。

Route::get('/hello-world', 'HelloWorldController@index')->middleware(\App\Http\Middleware\MobileRedirect::class);

事实上,我们可以更进一步,为我们的中间件创建一个别名,这样您就不必使用内联类名。

打开文件 app/Http/Kernel.php 并查找 $routeMiddleware ,它保存了别名到中间件的映射。让我们将我们的条目包含到该列表中,如以下代码片段所示。

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,
    'mobile.redirect' => \App\Http\Middleware\MobileRedirect::class
];

修改后的路由定义如下所示。

Route::get('/hello-world', 'HelloWorldController@index')->middleware('mobile.redirect');

这就是向 Laravel 应用程序注册中间件的故事。这非常简单,不是吗?

事实上,我们已经读到了本文的结尾,我希望您能充分享受它。

结论

探索任何框架中的架构概念总是令人兴奋的事情,这就是我们在本文中探索 Laravel 框架中的中间件时所做的事情。

从中间件的基本介绍开始,我们将注意力转移到在 Laravel 应用程序中创建自定义中间件的主题。文章的后半部分讨论了如何向 Laravel 注册自定义中间件,这也是探索附加中间件的不同方式的机会。

希望这次旅程富有成效,并且本文能够帮助您丰富您的知识。另外,如果您希望我在即将发表的文章中提出特定主题,您可以随时给我留言。

今天就这样,如果有任何疑问,请随时使用下面的提要来提出您的疑问!

以上是掌握 Laravel 中間件的基礎知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能