この記事では、ミドルウェアの概念を理解するために、Laravel フレームワークを深く掘り下げていきます。この記事の前半は、ミドルウェアの概要とその実際の使用法から始まります。
続けて、Laravel アプリケーションでカスタムミドルウェアを作成する方法について説明します。カスタムミドルウェアを作成したら、リクエスト処理フロー中に実際に呼び出せるように、それをLaravelに登録するために利用できるオプションを調べます。
Laravel の基本的な概念と、スキャフォールディング コードを生成するための Artisan コマンド ライン ツールについては十分に理解していただければ幸いです。もちろん、最新の Laravel アプリケーションが正常にインストールされていれば、この記事で提供されている例をすぐに実行できます。
ミドルウェアは、Laravel アプリケーションの典型的なリクエスト処理フローに接続できるメカニズムと考えることができます。通常の Laravel ルート処理は、リクエスト処理の特定の段階を通過します。ミドルウェアは、アプリケーションが通過する必要があるレイヤーの 1 つです。
では、Laravel のリクエスト処理プロセスを接続する意味は何でしょうか?アプリケーション起動の初期段階で行う必要があることについて考えてください。たとえば、ユーザーは、現在のルートへのアクセスを許可するかどうかを決定するために、早い段階で認証される必要があります。
ミドルウェアで実現できると考えられるものは次のとおりです。
実際、デフォルトの Laravel アプリケーションには、いくつかの重要なミドルウェアがすでに付属しています。たとえば、サイトがメンテナンス モードかどうかを確認するミドルウェアがあります。一方で、入力リクエストパラメータをサニタイズするミドルウェアもあります。先ほど述べたように、ユーザー認証はミドルウェア自体によっても実装されます。
これまでの説明で、ミドルウェアという用語に自信が持てるようになったと幸いです。まだ混乱している場合でも、心配しないでください。次のセクションでカスタム ミドルウェアの構築を開始します。これは、実際の世界でミドルウェアを使用する方法を正確に理解するのに役立ちます。
このセクションでは、カスタム ミドルウェアを作成します。しかし、カスタム ミドルウェアは正確に何を実現するのでしょうか?
最近、ユーザーがモバイル デバイスから Web サイトにアクセスする場合、すべてのクエリ文字列パラメーターを変更せずに、対応するサブドメイン URL にリダイレクトする必要があるというクライアントからのカスタム要件に遭遇しました。これは、この特定のシナリオで Laravel ミドルウェアを使用する方法を示すのに最適なユースケースであると思います。
この場合にミドルウェアを使用する理由は、アプリケーションのリクエスト フローにフックする必要があるためです。カスタム ミドルウェアでは、ユーザー エージェントをチェックし、ユーザーがモバイル デバイスを使用している場合は、対応するモバイル URL にリダイレクトされます。
すべての理論を議論した後、実際の開発を開始しましょう。これが新しい概念を理解する最良の方法ですよね。
Laravel 開発者としてカスタム機能を作成したい場合、ほとんどの場合 Artisan ツールを使用して基本的なテンプレート コードを作成することになります。これを使用して、カスタム ミドルウェアの基本的なテンプレート コードを作成してみましょう。
コマンド ラインに移動し、プロジェクトのドキュメント ルートに移動します。次のコマンドを実行して、カスタム ミドルウェア テンプレート MobileRedirect
を作成します。
これにより、次のコードを含むファイル app/Http/Middleware/MobileRedirect.php
が作成されます。
通常、handle
メソッドの実装に気づくでしょう。これはミドルウェアのバックボーンとして機能し、実装するミドルウェアのメイン ロジックが配置される場所です。
この機会に、Laravel に付属するミドルウェアの種類を紹介します。大きく分けてフロントミドルウェアとポストミドルウェアの2種類があります。
名前が示すように、ビフォア ミドルウェアは、リクエストが実際に処理され、レスポンスが構築される前に実行されるミドルウェアです。一方、ポストミドルウェアは、リクエストがアプリケーションによって処理された後に実行され、この時点までにレスポンスはすでに構築されています。
私たちの場合、リクエストを処理する前にユーザーをリダイレクトする必要があるため、プレミドルウェアとして開発されます。
次に、ファイル app/Http/Middleware/MobileRedirect.php
を次の内容で変更します。
簡単にするために、mobile
クエリ文字列パラメータが存在するかどうかのみを確認します。TRUE
に設定されている場合、ユーザーは対応するモバイル デバイス サイト URL にリダイレクトされます。もちろん、リアルタイム検出が必要な場合は、ユーザー エージェント検出ライブラリを使用することになります。
さらに、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 中国語 Web サイトの他の関連記事を参照してください。