ホームページ >バックエンド開発 >PHPチュートリアル >Laravelクイックヒント:モデルルートバインディング
laravelルーティングコンポーネント:簡素化と効率的なルーティング管理
この記事では、Laravelの強力なルーティングコンポーネントについて説明します。これは、シンプルで効率的なルーティング管理方法を提供し、ルーティンググループのシンプルなURL、パラメーター、グループ、命名、およびイベント保護をサポートしています。そのルーティングモデルの結合関数は、IDパラメーターではなくモデル名を促すことにより、反復タスクの処理を簡素化します。
コアポイント:
App\Exceptions\Handler@render
ModelNotFoundException
LARAVELでは、親モデルクラスのgetRouteKeyName
データベースには、管理者がバックグラウンドで管理できる一連のカテゴリがあるとします。ルーティングファイルは次のとおりです
クラスには、7つのリソースメソッドが含まれています。<code class="language-php">Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () { Route::resource('categories', 'CategoriesController'); });</code>操作では、編集されるカテゴリがデータベースに存在するかどうかを確認する必要があります。そうしないと、エラーメッセージが返され、リダイレクトされます。
CategoriesController
edit
ルーティングモデルバインディング
<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ルーティングモデルのバインディングの
FAQ 上記のコンテンツがあなたに役立つことを願っています!
以上がLaravelクイックヒント:モデルルートバインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。