ルーティング


ルーティング

    基本ルーティング
    • ルーティング リダイレクト
    • ルーティングの表示
  • ルーティング パラメータ
    • 必須パラメータ
    • オプション パラメータ
    • 正規表現パラメータ
  • 名前付きルート
  • ##ルート グループ
  • ミドルウェア#暗黙的バインディング
  • 明示的バインディング
    • フォールバック ルーティング
    周波数制限
  • フォームメソッドフォージェリ
  • 現在のルートにアクセス
基本ルーティング

基本ルートの構築には、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 保護

は、POSTPUT、または 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);

Route::permanentRedirect

メソッドを使用して 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) { 
   //
});

## が設定されていることを確認する必要があります。

##正規表現の制約

ルート インスタンスで
where

メソッドを使用して、ルート パラメータの形式を制約できます。

どこ

このメソッドは、パラメータ名と、パラメータの制約方法を定義する正規表現を受け入れます:

Route::get('user/{name?}', function ($name = null) { 
   return $name;
});
Route::get('user/{name?}', function ($name = 'John') {  
  return $name;
});
グローバル制約

必要に応じて特定のルーティング パラメーターはすべて、同じ正規表現の制約に従います。
pattern

メソッドを使用して、これらのパターンを

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ルーティングコンポーネントはすべての文字を許可しますを除外する ###/###。
where
条件付き正規表現を使用して、

/

がプレースホルダーの一部になることを明示的に許可する必要があります:

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 group

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

Namespace

もう 1 つの一般的な使用例は、

namespace

メソッドを使用して、ルーティング グループ内のすべてのコントローラーに同じ PHP 名前空間を割り当てることです。 ## は、ルート ファイルを名前空間グループに導入し、完全な App\Http\Controllers 名前空間プレフィックスを指定せずにコントローラー ルートを登録できるようにします。したがって、名前空間

App\Http\Controllers

以降の部分のみを指定する必要があります。

サブドメイン名のルーティングルーティング グループを使用して、サブドメイン名を処理することもできます。サブドメインには、ルート URI と同様にルート パラメーターを割り当てることができ、サブドメインの一部をルートまたはコントローラーのパラメーターとして取得できます。グループの前に

domain
メソッドを呼び出して、サブドメイン名を指定できます:
Route::middleware(['first', 'second'])->group(function () { 
   Route::get('/', function () { 
       // // 使用 first 和 second 中间件  
       });
    Route::get('user/profile', function () {  
       // // 使用 first 和 second 中间件
        });
    });

ルーティング プレフィックス

prefix
メソッドを使用して、ルーティング グループで指定された URL にプレフィックスを追加できます。たとえば、グループ内のすべてのルートの URI に admin というプレフィックスを付けることができます:
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 モデル インスタンス全体を注入できます。

#暗黙的なバインディング

Laravel は、ルートまたはコントローラーのアクションで定義された型ヒントを自動的に解析します。変数名は一致します。 Eloquent モデルのルート セグメント名。例:

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;
});
次に、

{user}

Route を含むパラメーターを定義します。 :

/**
 * 获取该模型的路由的自定义键名。
 *
 * @return string
 */
 public function getRouteKeyName(){
     return 'slug';
  }
すべての

{user}

パラメータを 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);
 }

Dynamic Access Control

#モデルの ##User

属性は、動的リクエストの最大値を指定します。たとえば、

User モデルに rate_limit 属性が含まれている場合、その属性名を throttle ミドルウェアに渡して、最大数の計算に使用できるようにすることができます。リクエスト数:

Route::fallback(function () {
    //
 });

##フォーム メソッドの偽造

HTML フォームは
PUT

をサポートしていません、

PATCH

または DELETE の動作。したがって、HTML フォームから PUTPATCH、または 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 ファサードで currentcurrentRouteName、および 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 インスタンスの基本クラスについて学ぶことができます。

この記事は、LearnKu.com Web サイトで初めて公開されました。