今日は、ミドルウェアでルートパラメータを使用する方法について説明します。これは、ワークフローで発生する可能性のあるタスクです。

ミドルウェアとは何ですか?

ミドルウェアは、単にアプリケーションの要求をラップします。 このように考えると、アプリケーションに対してリクエストが行われると、リクエストを処理するコードがありますが、またはリクエストを処理するコードで何かを発生させたい場合実行されると、ミドルウェアを入れます。

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', '[email protected]');

ルートで提供されるパラメーターは、通常、中括弧で注釈が付けられます。 たとえば、名前パラメータをルートに渡すには、次のようになります。

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);
    }
}

パラメータが特定の配列にあるかどうかを確認し、それに基づいてビューを返します。 必要に応じてプロファイルではない他のキーワードがある場合、必要なのはそれらをこの配列に追加することだけです。 クリーナーでしょ?