ミドルウェアでLaravelルートパラメータを取得する
今日は、ミドルウェアでルートパラメータを使用する方法について説明します。これは、ワークフローで発生する可能性のあるタスクです。
ミドルウェアとは何ですか?
ミドルウェアは、単にアプリケーションの要求をラップします。 このように考えると、アプリケーションに対してリクエストが行われると、リクエストを処理するコードがありますが、前または後リクエストを処理するコードで何かを発生させたい場合実行されると、ミドルウェアを入れます。
Laravelには、メンテナンス、認証、CSRF保護のためのミドルウェアがいくつか組み込まれています。これらはすべて、laravelプロジェクトフォルダー内の app / Http /Middlewareディレクトリにあります。
Laravelルートパラメータ
Laravelルートはapp/ Http /routers.phpファイルにあります。 ルートには通常、URLパスと、ハンドラー関数コールバックがあります。これは通常、特定のコントローラーで記述された関数です。
// Inline function to handle the route
Route::get('/', function () {
return view('welcome');
});
// Controller function to handle the route
Route::get('/profile', 'ProfileController@index');
ルートで提供されるパラメーターは、通常、中括弧で注釈が付けられます。 たとえば、名前パラメータをルートに渡すには、次のようになります。
Route::get('/params/{name}', function ($name) {
return $name
});
慣例により、Controller関数は、提供されたパラメーターに基づいてパラメーターを受け入れます。
ルートパラメータへのアクセス
ただし、ミドルウェアのパラメータへのアクセスはそれほど直接的ではありません。 まず、ルートで提供されたパラメータをダンプするDumpMiddleware
というミドルウェアを作成しましょう。
php artisan make:middleware DumpMiddleware
ファイルapp/ Http / Middlware /DumpMiddleware.phpが作成されます。
方法1:$request->route('parameter_name')
ルートパラメータには2つの方法でアクセスできます。 1つの方法は、$request->route('parameter_name')
。を使用することです。ここで、parameter_name
は、ルート内のパラメーターと呼ばれるものを指します。 app / Http / Middleware /DumpMiddleware.phpファイルで作成されたDumpMiddlewareクラス内のhandleメソッド。
public function handle($request, Closure $next)
{
dd($request->route('parameter_name'));
return $next($request);
}
ミドルウェアの動作を確認するために、ミドルウェアをルートに追加しましょう。 上に示したルートをすばやく作成し、 app / Http /routers.phpファイルにミドルウェアを追加します。
Route::get('/params/{name}', [
'middleware' => 'App\Http\Middleware\DumpMiddleware',
function () {
return view('welcome');
}]);
Laravelに新しいミドルウェアを認識させていないため、ミドルウェアの完全な名前空間が必要です。 これを行うには、 App \ Http \Kernel.phpファイルに$routeMiddleware
クラスプロパティの一部として追加します。
protected $routeMiddleware = [
// Middlewares commented out for brevity
'DumpMiddleware' => \App\Http\Middleware\DumpMiddleware::class,
];
次に、ルート内のミドルウェアを 'middleware' => 'DumpMiddleware',
に更新できます。
端末でphp artisan serve
を実行し、http://localhost:8000/params/scotch
を開きます。 ブラウザにscotchがダンプされているのがわかります。
方法2:$request->route()->paremeters()
ミドルウェアのルートパラメータにアクセスするもう1つの方法は、すべてのパラメータを取得することです。 この/params/{id}/{category}/{name}
のようなルートがあると想像してください。 すべてのルートパラメータは通常、配列に保存されます。配列は、ミドルウェアでは$request->route()->parameters()
からアクセスできます。 ルートを上記のルートに更新すると、
Route::get('/params/{id}/{category}/{name}', [
'middleware' => DumpMiddleware',
function () {
return view('welcome');
}]);
そして、ミドルウェアのhandleメソッドを次のように更新します。
public function handle($request, Closure $next)
{
dd($request->route()->parameters());
return $next($request);
}
http://localhost:8000/params/23/scotch/school
に移動すると、パラメーター名をキーとして、渡されたものを値として、ブラウザー内のパラメーターを配列としてダンプする必要があります。
ミドルウェアでルートパラメータにアクセスする理由
ミドルウェアのルートパラメータにアクセスするためのサンプルの使用法は、特定のルートがさまざまなアクションを実行する場合です。 たとえば、ユーザーのプロファイルを返すルート/{username}
があるとします。 たとえば、スコッチのプロファイルに移動するには、http://localhost:8000/scotch
に移動します。
ただし、このアプリには、必ずしもプロファイルに属していないルートが含まれている場合があります。 faq 、 support 、またはhelpのように。 このようなシナリオでは、通常、プロファイルを検索するルートの前にこれらのルートを定義することをお勧めします。
app / http / routers.php
Route::get('/faq', function() {
return view('faq');
});
Route::get('/help', function() {
return view('help');
});
Route::get('/support', function() {
return view('support');
});
// Route that handles profile comes last
Route::get('/{username}', function() {
return view('profile');
});
ただし、ミドルウェアでは、値が定義された配列にあるかどうかを確認してリダイレクトするだけです。
app / Http / routers.php
Route::get('/{username}', [
'middleware' => 'ProfileMiddleware',
function () {
return view('welcome');
}]);
次に、プロファイルミドルウェアで、これをハンドル関数に追加します。
<?php
namespace App\Http\Middleware;
use Closure;
// Add Response namespace
use Illuminate\Http\Response;
class ProfileMiddleware
{
public function handle($request, Closure $next)
{
$routes = ["faq", "support", "help"];
$route = $request->route('username');
// Redirect to custom page if it doesn't relate to a profile
if (in_array($route, $routes)) {
return new Response(view($route));
}
return $next($request);
}
}
パラメータが特定の配列にあるかどうかを確認し、それに基づいてビューを返します。 必要に応じてプロファイルではない他のキーワードがある場合、必要なのはそれらをこの配列に追加することだけです。 クリーナーでしょ?