ルーティング
- 基本ルーティング
- ルーティング パラメータ
- 名前付きルート
- ##ルート グループ
- ミドルウェア
- 名前空間
- サブドメイン ルーティング
- ルーティング プレフィックス
- #ルート命名プレフィックス
- ##ルーティング モデル バインディング
- 明示的バインディング周波数制限
- フォームメソッドフォージェリ
- 現在のルートにアクセス
基本ルートの構築には、URI と クロージャ
のみが必要です。ルートを定義するための非常にシンプルで洗練された方法が提供されます:Route::get('foo', function () { return 'Hello World'; });
デフォルトのルーティングファイル
すべてのLaravelルートは、routes
ディレクトリ内のルーティングファイルで定義されており、これらのファイルはフレームワークによって自動的にロードされます。 routes/web.php
ファイルは、web
インターフェイスのルートを定義するために使用されます。ここでのルートは、セッション状態や CSRF 保護などの機能を提供する web
ミドルウェア グループに割り当てられます。 routes/api.php
で定義されたルートはステートレスであり、api
ミドルウェア グループが割り当てられます。
ほとんどのアプリケーションのビルドは、routes/web.php
ファイルでルートを定義することから始まります。 routes/web.php
で定義されたルートには、定義されたルート URL をブラウザに入力することでアクセスできます。たとえば、ブラウザに http://your-app.dev/user
と入力すると、次のルート
Route::get('/user', 'UserController@index');
routes/api.php
ファイルにアクセスできます。定義されたルートは、RouteServiceProvider
を通じてルーティング グループにネストされます。このルート グループ内では、URL プレフィックス /api
がこのファイル内の各ルートに自動的に追加されるため、手動で追加する必要はありません。このプレフィックスと他のルート グループ オプションは、RouteServiceProvider
クラスで変更できます。
利用可能なルーティング方法
ルーターを使用すると、あらゆる HTTP リクエストに応答できるルートを登録できます:
Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);
登録が必要になる場合があります。任意の HTTP リクエストに応答できるルート: 複数の HTTP リクエストに応答するには、match
メソッドを使用するか、any
メソッドを使用して、次の HTTP リクエストに応答するルートを登録します。すべての HTTP リクエスト:
Route::match(['get', 'post'], '/', function () { // }); Route::any('foo', function () { // });
CSRF 保護
は、POST
、PUT
、または DELETE## を指します。
#web ルーティング ファイルで定義されています。ルーティングされる HTML フォームには CSRF トークン フィールドが含まれている必要があります。そうでない場合、リクエストは拒否されます。 CSRF の詳細については、CSRF ドキュメントを参照してください。
<form method="POST" action="/profile"> @csrf ... </form>リダイレクト ルートTo を定義したい場合ルートを別の URI にリダイレクトするには、
Route::redirect メソッドを使用します。このメソッドは、完全なルートまたはコントローラーを定義することなく、リダイレクトを迅速に実装できます。
Route::redirect('/here', '/there');
Route::redirect デフォルトのステータス コード
302## が返されます # 。戻りコードは 3 番目のパラメータを使用してカスタマイズできます: Route::redirect('/here', '/there', 301);
メソッドを使用して 301
ステータス コードを返すこともできます: リーリー
ビュー ルーティング
ルートがビューを返すだけでよい場合は、Route::view
メソッドを使用できます。これは redirect
と同じくらい便利で、完全なルートやコントローラーを定義する必要はありません。 view
このメソッドには 3 つのパラメータがあり、最初のパラメータは必須パラメータであり、ビュー名を含む URI です。 2 番目の必須パラメータは、レンダリングする必要があるビューの名前です。 3 番目のパラメータはオプションのパラメータです。配列を渡すと、配列内のデータがビューに渡されます:
Route::permanentRedirect('/here', '/there');
ルートパラメータ
必須パラメータ
もちろん、場合によっては、ルート。たとえば、URL からユーザーの ID を取得するには、ルート パラメータを定義することでこれを行うことができます:
Route::view('/welcome', 'welcome'); Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
また、必要に応じてルート内に複数のパラメータを定義することもできます:
Route::get('user/{id}', function ($id) { return 'User '.$id; });
ルートは通常 {}
内に配置され、パラメータ名には文字のみを使用できます。同時に、ルーティング パラメータには -
記号を含めることはできません。下線 (_#) ##) は必要に応じて使用できます。ルート パラメーターは、コールバックまたはコントローラーのパラメーター名に関係なく、ルート コールバックまたはコントローラーに順番に挿入されます。
タグを追加できますが、その前提として、ルートの対応する変数にデフォルト値 #
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
メソッドを使用して、ルート パラメータの形式を制約できます。
どこ このメソッドは、パラメータ名と、パラメータの制約方法を定義する正規表現を受け入れます: Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
グローバル制約
メソッドを使用して、これらのパターンを
RouteServiceProvider の boot
メソッドで定義します。
Route::get('user/{name}', function ($name) { // })->where('name', '[A-Za-z]+'); Route::get('user/{id}', function ($id) { // })->where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { // })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
一度定義すると、これらのルールはこのパラメータ名を使用するすべてのルートに自動的に適用されます:
/** * 定义你的路由模型绑定, pattern 过滤器等。 * * @return void */ public function boot(){ Route::pattern('id', '[0-9]+'); parent::boot(); }
エンコードされたスラッシュ文字Laravelルーティングコンポーネントはすべての文字を許可しますを除外する ###/###。 /
がプレースホルダーの一部になることを明示的に許可する必要があります:Route::get('user/{id}', function ($id) { // 只有在 id 为数字时才执行。 });
注: エンコードされたスラッシュ文字は最後の部分でのみサポートされます。ルーティングセグメント。
ルートの名前付け
ルートの名前付けにより、指定したルートの URL またはリダイレクトを簡単に生成できます。ルート定義で name
メソッドを連鎖することでルート名を指定できます:
Route::get('search/{search}', function ($search) { return $search; })->where('search', '.*');
また、コントローラー アクションのルート名を指定することもできます:
Route::get('user/profile', function () { // })->name('profile');
指定したルートの URL を生成します
ルートの名前を指定した後、グローバル補助関数 route
を使用してリンクを生成したり、ルートにリダイレクトしたりできます。
Route::get('user/profile', 'UserProfileController@show')->name('profile');
パラメータが定義された名前付きルートの場合、パラメータを route
関数の 2 番目のパラメータとして渡すことができ、指定されたパラメータはファイル内の対応する位置に自動的に挿入されます。 URL:
// 生成 URL... $url = route('profile'); // 生成重定向... return redirect()->route('profile');
現在のルートを確認します
現在のリクエストが特定のルートを指しているかどうかを確認したい場合は、named## を呼び出すことができます。 # ルーティング インスタンスのメソッド。たとえば、ルーティング ミドルウェアで現在のルート名を確認できます。
Route::get('user/{id}/profile', function ($id) { // })->name('profile'); $url = route('profile', ['id' => 1]);routing grouprouting groupミドルウェアや名前空間などのルート プロパティを、ルートごとに個別に定義せずに、多数のルート間で共有できます。共有属性は、配列の形式で
Route::group メソッドの最初のパラメーターに渡す必要があります。
ルーティング グループ内のすべてのルートにミドルウェアを割り当てるには、グループの前にミドルウェアを呼び出すことができます
middleware メソッドでは、ミドルウェアは配列にリストされている順序で実行されます: /**
* 处理一次请求。
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next){
if ($request->route()->named('profile')) {
//
}
return $next($request);
}
もう 1 つの一般的な使用例は、
namespace メソッドを使用して、ルーティング グループ内のすべてのコントローラーに同じ PHP 名前空間を割り当てることです。 ## は、ルート ファイルを名前空間グループに導入し、完全な App\Http\Controllers
名前空間プレフィックスを指定せずにコントローラー ルートを登録できるようにします。したがって、名前空間
以降の部分のみを指定する必要があります。
サブドメイン名のルーティングルーティング グループを使用して、サブドメイン名を処理することもできます。サブドメインには、ルート URI と同様にルート パラメーターを割り当てることができ、サブドメインの一部をルートまたはコントローラーのパラメーターとして取得できます。グループの前に
domainRoute::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // // 使用 first 和 second 中间件 }); Route::get('user/profile', function () { // // 使用 first 和 second 中间件 }); });
Route::namespace('Admin')->group(function () { // 在 "App\Http\Controllers\Admin" 命名空间下的控制器 });
ルート名のプレフィックス
name メソッドを使用すると、ルーティング グループ内の各ルート名に特定の文字列を追加できます。たとえば、すべてのグループ ルートの名前に「admin」というプレフィックスを付けることができます。指定された文字列は、指定されたルート名のプレフィックスとまったく同じであるため、プレフィックスの末尾 .
文字を必ず指定します:
Route::domain('{account}.myapp.com')->group(function () { Route::get('user/{id}', function ($account, $id) { // }); });
ルート モデル バインディング
モデル ID をルートまたはコントローラーの動作に挿入するときは、この ID に対応するモデルをクエリする必要があります。 Laravel は、ルートモデルバインディングがモデルインスタンスをルートに直接かつ自動的に挿入する方法を提供します。たとえば、ユーザーの ID を注入する代わりに、特定の ID に一致する User
モデル インスタンス全体を注入できます。
Route::prefix('admin')->group(function () { Route::get('users', function () { // 匹配包含 "/admin/users" 的 URL }); });この例では、
$user 変数は Eloquent モデル
App\User に対してタイプヒントされているため、変数名は次と同じです。 URI.{user}
の が一致するため、Laravel はリクエスト URI で渡された ID と一致するユーザーモデルインスタンスを自動的に挿入します。対応するモデル インスタンスがデータベース内に見つからない場合、404 例外が自動的に生成されます。
id 以外のデータベースを使用する場合は、オーバーライドできます。 Eloquent モデルの
getRouteKeyName メソッド:
Route::name('admin.')->group(function () { Route::get('users', function () { // 指定路由名为 "admin.users"... })->name('users');});
明示的なバインディングを登録するにはバインディングでは、ルーターの
model メソッドを使用して、指定されたパラメーターのクラスを指定します。これらの明示的なモデル バインディングを、RouteServiceProvider
クラスの boot
メソッド内で定義します。
次に、Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
Route を含むパラメーターを定義します。 :
すべての /**
* 获取该模型的路由的自定义键名。
*
* @return string
*/
public function getRouteKeyName(){
return 'slug';
}
パラメータを App\User
モデルにバインドしているため、User
インスタンスはこのルートを注入します。たとえば、profile/1
のリクエストは、ID 1 の User
インスタンスをデータベースに挿入します。 一致するモデル インスタンスがデータベース内に見つからない場合、404 例外が自動的にスローされます。
カスタム ロジック解析
カスタム解析ロジックを使用する場合は、Route::bind
メソッドを使用します。 bind
メソッドに渡される closure
は、URI の中括弧に対応する値を受け入れ、ルートに挿入するクラスのインスタンスを返します:
public function boot(){ parent::boot(); Route::model('user', App\User::class); }
あるいは、Eloquent モデルの resolveRouteBinding
メソッドをオーバーライドすることもできます。このメソッドは、URI の中括弧に対応する値を受け入れ、ルートに挿入するクラスのインスタンスを返します:
Route::get('profile/{user}', function (App\User $user) { // });##Fallback Route
Route::fallback メソッドを使用すると、受信リクエストに一致するルートが他にない場合に実行されるルートを定義できます。通常、未処理のリクエストは、アプリケーションの例外ハンドラーを介して「404」ページで自動的にレンダリングされます。ただし、
routes/web.php ファイルで
fallback ルートを定義できるため、
web ミドルウェアのすべてのミドルウェアがルートに適用されます。もちろん、必要に応じてこのルートにミドルウェアを追加できます。
/** * 启动应用服务。 * * @return void */ public function boot(){ parent::boot(); Route::bind('user', function ($value) { return App\User::where('name', $value)->first() ?? abort(404); }); }
{note} フォールバック ルートは、常にアプリケーションによって登録された最後のルートである必要があります。
Laravel には、アプリケーションのルートへのアクセスを制御するためのミドルウェアが含まれています。これを使用する場合は、
throttle ミドルウェアをルートまたはルート グループに割り当てます。 throttle
ミドルウェアは 2 つのパラメーターを受け取り、指定された分数内に実行できるリクエストの最大数を決定します。たとえば、認証され、ユーザーが 1 分間に 60 回以下のアクセスを行うルーティング グループを指定してみましょう。 /**
* 检索绑定值的模型。
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value){
return $this->where('name', $value)->first() ?? abort(404);
}
#モデルの ##User
属性は、動的リクエストの最大値を指定します。たとえば、User モデルに
rate_limit 属性が含まれている場合、その属性名を
throttle ミドルウェアに渡して、最大数の計算に使用できるようにすることができます。リクエスト数:
Route::fallback(function () { // });
をサポートしていません、
PATCH または DELETE
の動作。したがって、HTML フォームから PUT
、PATCH
、または DELETE
の動作を定義するルートを呼び出す場合は、非表示の # を追加する必要があります。 ##_method タグを入力します。
_method フィールドの値を HTTP リクエスト メソッドとして使用します:
Route::middleware('auth:api', 'throttle:60,1')->group(function () { Route::get('/user', function () { // }); });
@method テンプレート ディレクティブを使用して
_method を生成することもできます。入力: Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () { Route::get('/user', function () { // }); });
現在のルートへのアクセス
Route ファサードで current
、currentRouteName
、および currentRouteAction
メソッドを使用してプロセスにアクセスできます。ルーティング情報:
<form action="/foo/bar" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> </form>
アクセス可能なすべてのメソッドを知りたい場合は、API ドキュメントを確認して、Route ファサードと Route インスタンスの基本クラスについて学ぶことができます。