Laravel ルートをマスターする
公開: 2022-12-12バックエンドに関して言えば、開発者は最終的にルートに遭遇します。 サーバーが受信するすべての要求は、要求をコントローラーまたはアクションにマップするルーティング リストを介してコントローラーにリダイレクトされるため、ルートはバックエンドのバックボーンと見なすことができます。
Laravel は多くの実装の詳細を隠しており、新しい開発者と経験豊富な開発者の両方が Web アプリケーションを開発するのに役立つ多くのシンタックス シュガーが付属しています。
Laravel でルートを管理する方法を詳しく見てみましょう。
Laravel でのバックエンド ルーティングとクロスサイト スクリプティング
サーバーには、パブリック ルートとプライベート ルートの両方が存在します。 パブリック ルートは、クロスサイト スクリプティング (XSS) の可能性があるため、懸念の原因になる可能性があります。これは、インジェクション攻撃の一種であり、悪意のあるアクターに対して脆弱になる可能性があります。
問題は、ユーザーがセッション トークンを必要としないルートからセッション トークンを必要とするルートにリダイレクトされる可能性があり、トークンがなくてもアクセスできることです。
この問題を解決する最も簡単な方法は、新しい HTTP ヘッダーを適用し、ルートに「リファラー」を追加して、このシナリオを軽減することです。
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Laravel 基本ルーティング
Laravel では、ルートを使用すると、ユーザーは適切なリクエストを目的のコントローラーにルーティングできます。 最も基本的な Laravel Route は、Uniform Asset Identifier (ルート パス) と、関数またはクラスの両方であるクロージャを受け入れます。
Laravel では、ルートはweb.phpおよびapi.phpファイル内に作成されます。 Laravel には、デフォルトで 2 つのルートが付属しています。1 つは WEB 用で、もう 1 つは API 用です。
これらのルートはroutes/フォルダーにありますが、 Providers/RouteServiceProvider.phpにロードされます。
これを行う代わりに、ルートをRouteServiceProvider.php内に直接ロードして、 routes/フォルダーを完全にスキップすることができます。
リダイレクト
ルートを定義するとき、通常はそれにアクセスするユーザーをリダイレクトする必要がありますが、その理由はさまざまです。 廃止されたルートであり、バックエンドまたはサーバーを変更したためか、2 要素認証 (2FA) をインストールしたいためである可能性があります。
Laravel には、これを行う簡単な方法があります。 フレームワークの単純さのおかげで、Route ファサードでリダイレクト メソッドを使用できます。このメソッドは、エントリ ルートとリダイレクト先のルートを受け入れます。
オプションで、リダイレクトのステータス コードを 3 番目のパラメータとして指定できます。 permanentRedirect
メソッドは、常に 301 ステータス コードを返すことを除いて、 redirect
メソッドと同じことを行います。
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
リダイレクト ルート内では、Laravel によって予約されているため、「destination」および「status」キーワードをパラメーターとして使用することは禁止されています。
// Illegal to use Route::redirect("/home", "/office/{status}");
ビュー
ビューは . Laravelアプリケーションのフロントエンドをレンダリングするために使用するblade.phpファイル。 ブレード テンプレート エンジンを使用し、Laravel のみを使用してフルスタック アプリケーションを構築するデフォルトの方法です。
ルートがビューを返すようにしたい場合は、単純に Route ファサードで view メソッドを使用できます。 これは、ルート パラメーター、ビュー名、およびビューに渡されるオプションの値の配列を受け入れます。
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
ビューが「こんにちは、 {name}
」と言いたいと仮定して、オプションの配列とそのパラメーターを渡します。 次のコードでそれを行うことができます (欠落しているパラメーターがビューで必要な場合、要求は失敗し、エラーがスローされます)。
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
ルート一覧
アプリケーションのサイズが大きくなるにつれて、ルーティングする必要があるリクエストの数も増えます。 そして、大量の情報には大きな混乱が生じる可能性があります。
ここで、 artisan route:list command
役に立ちます。 アプリケーション、ミドルウェア、およびコントローラーで定義されているすべてのルートの概要を提供します。
php artisan route:list
ミドルウェアを含まないすべてのルートのリストが表示されます。 これには、 -v
フラグを使用する必要があります。
php artisan route:list -v
ルートのパスに特定の名前が含まれるドメイン駆動設計を使用している可能性がある状況では、次のようにこのコマンドのフィルタリング機能を利用できます。
php artisan route:list –path=api/account
これにより、 api/accountで始まるルートのみが表示されます。
一方、 –except-vendor
または–only-vendor
オプションを使用して、サードパーティが定義したルートを除外または含めるように Laravel に指示できます。
ルート パラメータ
ユーザー ID やトークンなど、URI のセグメントをルートでキャプチャする必要がある場合があります。 これを行うには、常に中かっこ ( {}
) で囲まれ、アルファベット文字のみで構成されるルート パラメーターを定義します。
ルートのコールバック内に依存関係がある場合、Laravel サービス コンテナーはそれらを自動的に挿入します。
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
必須パラメータ
Laravel の必須パラメーターは、呼び出し時にスキップできないルートのパラメーターです。 それ以外の場合、エラーがスローされます。
Route::post("/gdpr/{userId}", GetGdprDataController.php");
GetGdprDataController.php内で、 $userIdパラメータに直接アクセスできるようになります。
public function __invoke(int $userId) { // Use the userId that we received… }
ルートは、任意の数のパラメーターを取ることができます。 それらは、リストされている順序に基づいて、ルート コールバック/コントローラーに挿入されます。
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
オプションのパラメータ
アプリケーション全体に影響を与えることなく、パラメーターのみが存在し、他に何も存在しないルートで何かを実行したい状況では、オプションのパラメーターを追加できます。 これらのオプションのパラメーターは、 ?
それらに追加:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
ルート ワイルドカード
Laravel は、オプションまたは必須のパラメーターがどのように見えるかをフィルタリングする方法を提供します。
ユーザー ID の文字列が必要だとします。 where
メソッドを使用して、ルート レベルで同様に検証できます。
where
メソッドは、パラメーターの名前と、検証に適用される正規表現ルールを受け入れます。 デフォルトでは、最初のパラメーターを受け取りますが、パラメーターが多数ある場合は、パラメーターの名前をキーとして、ルールを値として配列を渡すことができ、Laravel はそれらをすべて解析します。
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
これをさらに一歩進めて、 Route
ファサードでpattern
メソッドを使用して、アプリケーション内のすべてのルートに検証を適用できます。
Route::pattern('id', '[0-9]+');
これにより、この正規表現ですべてのid
パラメータが検証されます。 一度定義すると、そのパラメーター名を使用するすべてのルートに自動的に適用されます。
ご覧のとおり、Laravel は/
文字をパスの区切り文字として使用しています。 パスで使用したい場合は、 where
正規表現を使用して明示的にプレースホルダーの一部にする必要があります。
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
唯一の欠点は、最後のルート セグメントでのみサポートされることです。
名前付きルート
名前が示すように、ルートに名前を付けることができるため、URL を生成したり、特定のルートにリダイレクトしたりするのに便利です。
名前付きルートの作成方法
名前付きルートを作成する簡単な方法は、 Route
ファサードにチェーンされたname
メソッドによって提供されます。 各ルートの名前は一意である必要があります。
Route::get('/', function () { })->name("homepage");
ルート グループ
ルート グループを使用すると、ルートごとに再定義する必要なく、多数のルートでミドルウェアなどのルート属性を共有できます。
ミドルウェア
ミドルウェアをすべてのルートに割り当てると、最初にgroup
メソッドを使用してそれらをグループにまとめることができます。 考慮すべきことの 1 つは、ミドルウェアがグループに適用される順序で実行されることです。
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
コントローラー
グループが同じコントローラーを使用する場合、 controller
メソッドを使用して、そのグループ内のすべてのルートに共通のコントローラーを定義できます。 ここで、ルートが呼び出すメソッドを指定する必要があります。
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
サブドメイン ルーティング
サブドメイン名は、Web サイトのドメイン名の先頭に追加される追加情報です。 これにより、Web サイトは、オンライン ストア、ブログ、プレゼンテーションなどの特定の機能のコンテンツを Web サイトの残りの部分から分離して整理できます。
私たちのルートは、サブドメインのルーティングを処理するために使用できます。 コントローラーとルートで使用するために、ドメインとサブドメインの一部をキャッチできます。 Route
ファサードのdomain
メソッドの助けを借りて、ルートを単一のドメインにグループ化できます。
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
プレフィックスと名前のプレフィックス
ルートのグループがある場合は、それらを 1 つずつ変更する代わりに、 Route
ファサードのprefix
やname
など、Laravel が提供する追加のユーティリティを利用できます。
prefix
メソッドを使用して、グループ内の各ルートに特定の URI のプレフィックスを付けることができます。name メソッドを使用して、各ルート名に特定の文字列をプレフィックスname
付けることができます。
これにより、管理ルートのような新しいものを作成することができ、それらを識別するためにすべての名前やプレフィックスを変更する必要がなくなります:
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
これで、これらのルートの URI はadmin/get
、 admin/put
、 admin/post
になり、名前はadmin.get
、 admin.put
、およびadmin.post
なります。
ルートキャッシング
アプリケーションを本番サーバーにデプロイするとき、優れた Laravel 開発者は Laravel のルート キャッシュを利用します。
ルート キャッシングとは
ルート キャッシングにより、すべてのアプリケーション ルートを登録するのにかかる時間が短縮されます。
php artisan route:cache
を実行するとIlluminate/Routing/RouteCollection
のインスタンスが生成され、エンコードされた後、シリアル化された出力がbootstrap/cache.routes.php
に書き込まれます。
このキャッシュ ファイルが存在する場合、他の要求はこのキャッシュ ファイルをロードします。 したがって、アプリケーションはルート ファイルのエントリを解析してIlluminate/Routing/Route
Illuminate/Routing/RouteCollection
Route オブジェクトに変換する必要がなくなりました。
ルート キャッシュを使用することが重要な理由
Laravel が提供するルート キャッシング機能を使用しないと、アプリケーションの実行が予想以上に遅くなるリスクがあり、その結果、売り上げ、ユーザー維持率、ブランドへの信頼が低下する可能性があります。
プロジェクトの規模とルートの数に応じて、単純なルート キャッシュ コマンドを実行するだけで、アプリケーションを 130% から 500% 高速化できます。
概要
ルーティングは、バックエンド開発のバックボーンです。 Laravel フレームワークは、ルートを定義および管理する詳細な方法を提供することで、これに優れています。
開発は確かに誰にとってもアクセス可能であり、Laravel で構築されているというだけでアプリケーションの高速化に役立ちます。
Laravel のルートに関して、他にどんなトリックやヒントに遭遇しましたか? コメント欄でお知らせください!