在本文中,我們將深入探討 Laravel 框架,以了解中介軟體的概念。本文的前半部首先介紹中間件及其實際用途。
#隨著我們繼續,我們將介紹如何在 Laravel 應用程式中建立自訂中間件。建立自訂中間件後,我們將探索可用於將其註冊到 Laravel 的選項,以便可以在請求處理流程中實際呼叫它。
我希望您認為自己熟悉基本的 Laravel 概念和用於生成腳手架程式碼的 Artisan 命令列工具。當然,最新 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中文網其他相關文章!