ホームページ >バックエンド開発 >PHPチュートリアル >Laravelクイックヒント:モデルルートバインディング

Laravelクイックヒント:モデルルートバインディング

Christopher Nolan
Christopher Nolanオリジナル
2025-02-10 11:35:12922ブラウズ

laravelルーティングコンポーネント:簡素化と効率的なルーティング管理

この記事では、Laravelの強力なルーティングコンポーネントについて説明します。これは、シンプルで効率的なルーティング管理方法を提供し、ルーティンググループのシンプルなURL、パラメーター、グループ、命名、およびイベント保護をサポートしています。そのルーティングモデルの結合関数は、IDパラメーターではなくモデル名を促すことにより、反復タスクの処理を簡素化します。

Laravel Quick Tip: Model Route Binding

コアポイント:

    Laravelのルーティングコンポーネントは、シンプルで効率的なルーティング管理方法を提供し、シンプルなURL、パラメーター、グループ、命名、およびイベント保護ルーティンググループをサポートします。ルーティングモデルのバインディング関数は、IDパラメーターではなくモデル名をプロンプトすることにより、反復タスク処理を簡素化します。
  • Laravelのルーティングモデルバインディングは、IDパラメーターを使用してモデルを自動的に解析し、モデルが存在しない場合は例外をスローします。
  • メソッドは、例外をHTTP応答に変換する責任があり、
  • を処理し、404ページにリダイレクトするために使用できます。 App\Exceptions\Handler@render ModelNotFoundExceptionLARAVELでは、親モデルクラスの
  • メソッドの書き換えなど、UUIDなどの異なる属性名を使用するなど、カスタムルーティングモデルバインディングが可能になります。これにより、内部IDがエンドユーザーに公開されないようになります。
  • getRouteKeyName
例:バックエンドカテゴリを管理

データベースには、管理者がバックグラウンドで管理できる一連のカテゴリがあるとします。ルーティングファイルは次のとおりです

クラスには、7つのリソースメソッドが含まれています。
<code class="language-php">Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::resource('categories', 'CategoriesController');
});</code>
操作では、編集されるカテゴリがデータベースに存在するかどうかを確認する必要があります。そうしないと、エラーメッセージが返され、リダイレクトされます。

CategoriesControllereditルーティングモデルバインディング

<code class="language-php">public function edit($id)
{
    $category = Category::find($id);
    if (!$category) {
        return redirect()->route('admin.categories.index')->withErrors([trans('errors.category_not_found')]);
    }

    // ...
}</code>

これは一般的な慣行ですが、Laravelはより最適化された方法を提供します - ルーティングモデルバインディング。入力するだけでモデル名をプロンプトします。IDパラメーターは必要ありません。 利用可能なルートリストは次のとおりです

ルーティングパラメーターは

であり、必要に応じて変更できます。 Laravelは、それを変更するオプションを提供します:

<code>+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
| Domain | Method    | URI                                | Name                               | Action                                                               | Middleware      |
+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
|        | GET|HEAD  | admin/categories                   | admin.categories.index             | App\Http\Controllers\Admin\CategoriesController@index                | web,admin       |
|        | POST      | admin/categories                   | admin.categories.store             | App\Http\Controllers\Admin\CategoriesController@store                | web,admin       |
|        | GET|HEAD  | admin/categories/create            | admin.categories.create            | App\Http\Controllers\Admin\CategoriesController@create               | web,admin       |
|        | GET|HEAD  | admin/categories/{categories}      | admin.categories.show              | App\Http\Controllers\Admin\CategoriesController@show                 | web,admin       |
|        | PUT|PATCH | admin/categories/{categories}      | admin.categories.update            | App\Http\Controllers\Admin\CategoriesController@update               | web,admin       |
|        | DELETE    | admin/categories/{categories}      | admin.categories.destroy           | App\Http\Controllers\Admin\CategoriesController@destroy              | web,admin       |
|        | GET|HEAD  | admin/categories/{categories}/edit | admin.categories.edit              | App\Http\Controllers\Admin\CategoriesController@edit                 | web,admin       |</code>
変更されたルート:

{categories}

<code class="language-php">Route::resource('categories', 'CategoriesController', [
    'parameters' => 'singular',
]);</code>
注:

Laravel 5.3は、デフォルトで特異フォームを使用します。

<code>+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
| Domain | Method    | URI                                | Name                               | Action                                                               | Middleware      |
+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+
|        | GET|HEAD  | admin/categories                   | admin.categories.index             | App\Http\Controllers\Admin\CategoriesController@index                | web,admin       |
|        | POST      | admin/categories                   | admin.categories.store             | App\Http\Controllers\Admin\CategoriesController@store                | web,admin       |
|        | GET|HEAD  | admin/categories/create            | admin.categories.create            | App\Http\Controllers\Admin\CategoriesController@create               | web,admin       |
|        | GET|HEAD  | admin/categories/{category}        | admin.categories.show              | App\Http\Controllers\Admin\CategoriesController@show                 | web,admin       |
|        | PUT|PATCH | admin/categories/{category}        | admin.categories.update            | App\Http\Controllers\Admin\CategoriesController@update               | web,admin       |
|        | DELETE    | admin/categories/{category}        | admin.categories.destroy           | App\Http\Controllers\Admin\CategoriesController@destroy              | web,admin       |
|        | GET|HEAD  | admin/categories/{category}/edit   | admin.categories.edit              | App\Http\Controllers\Admin\CategoriesController@edit                 | web,admin       |</code>

Laravelは、モデルが存在しない場合に例外をスローするために、IDパラメーターを使用してカテゴリを自動的に解析します。

注:
<code class="language-php">public function edit(Category $category)
{
    return view('admin.categories.edit', [
        'category'      => $category
    ]);
}</code>
パラメーターにデフォルト値がある場合がない限り、

eloquentメソッドを使用してパラメーターを解析します。

例外処理findOrFail

メソッドは、例外をHTTP応答に変換する責任があります。それを使用してを処理し、404ページにリダイレクトします。

このメソッドには、

およびApp\Exceptions\Handler@renderパラメーターがあり、実行するアクションを決定するために使用できます。 ModelNotFoundException

<code class="language-php">Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::resource('categories', 'CategoriesController');
});</code>

スローされた例外がModelNotFoundExceptionのインスタンスであるかどうかをテストします。モデル名をテストして、正しいエラーメッセージを表示することもできます。すべてのモデルに複数のifテストを追加しないようにするために、インデックス付きメッセージの配列を作成し、モデルクラス名を使用して正しいメッセージを抽出できます。

パラメーター分析

Laravelは名前とタイプのヒントを使用して、ルーティングパラメーターを解決します。パラメータータイプがモデルである場合、IDを使用してデータベース内のレコードを検索しようとし、レコードが見つからない場合は失敗します。

カスタムルーティングキー

内部IDがエンドユーザーに公開されないようにするために、通常、UUIDが使用されます。しかし、Laravelはテーブルプライマリキーを使用してバインドされたパラメーターを解析するため、エラーは常にスローされます!

これを行うために、Laravelを使用すると、親モデルクラスの

メソッドを書き換えることができます。この方法は、プロパティ名、この場合はUUIDを返す必要があります。 getRouteKeyName

<code class="language-php">public function edit($id)
{
    $category = Category::find($id);
    if (!$category) {
        return redirect()->route('admin.categories.index')->withErrors([trans('errors.category_not_found')]);
    }

    // ...
}</code>
UUIDを使用して特定のカテゴリを編集しようとする場合、たとえば

https://www.php.cn/link/604541b9b9f266538ed001ea49fcc956 など、予想どおりに機能するはずです。

Laravel Quick Tip: Model Route Binding Laravelルーティングモデルのバインディングの

FAQ 上記のコンテンツがあなたに役立つことを願っています!

以上がLaravelクイックヒント:モデルルートバインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。