Laravelのルートモデルバインディングを解説

※当サイトは、アフィリエイト広告を利用しています
Laravel
スポンサーリンク

この記事ではLaravelのルートモデルバイングについての解説を行います。

ルートモデルバインディングを行うことでコードの記述を減らして開発効率を高めることができます。

もしかすると知らず知らず使っている方もいるかもしれません。

ぜひこの機会に理解していってください。

スポンサーリンク

通常のルーティングの場合

まずは通常のルーティングをおさらいしましょう。

以下のようなルーティングがあったとします。

Route::get('/user/{id}', [UserController::class, show);

ユーザーのidごとのURLでユーザーページを表示させるルーティングです。

Controller内はこのようになります。

public function show($id)
{
  $user = User::find($id);
  
  $if (!$user) {
    abort(404);
  }

  return view('user.show', [
    'user' => $user 
  ]);

}

引数で渡ってきた$idをもとに、Userモデルからインスタンスを作成します。

対象のデータがない場合は、404のページを表示させる処理を書いています。

ある場合はviewを表示させ、対象ユーザーの$userを一緒に渡しています。

シンプルなコードです。

スポンサーリンク

ルートモデルバインディングを使った場合

先ほどのルーティングからControllerの処理をルートモデルバインディングを使って書いてみます。

まずはルーティングの部分から。

Route::get('/user/{user}', [UserController::class, show);

先ほどから変わったのは「{user}」となっている点です。

続いてController部分を見ていきます。

public function show(User $user)
{
  return view('user.show', [
    'user' => $user 
  ]);

}

showメソッドに渡している引数にUserクラスの「$user」を指定しています。

ポイントは、引数の「$user」とルーティングの「{user}」を同じものにすることです。

これで渡ってきたURL「https://test.com/user/1」からidが1のUserインスタンスが$userとして渡ってきます。

ルートモデルバインディングの利点

ルートモデルバインディングの利点は可読性の向上記述量が少なくなる点です。

{id}と書いてあるより、{user}と書いてある方が何を表示させるルーティングなのかわかりやすいです。

さらに、渡ってきたidに該当するUserインスタンスが存在しない場合は、自動的に404ページを返すようになります。

idがない場合の処理も必要なくなったのでコードがスッキリしますね。

ルートモデルバインディングはid以外を基準にすることも可能

先ほどまではルートモデルバインディングの基本的な使い方を紹介しました。

そこではidを基準にして対象のインスタンスを返していました。

しかしid以外のカラムを基準にすることも可能です

2種類あるので順番に紹介します。

ルーティングで設定

まずはルーティングで設定する方法です。

Route::get('/user/{user:name}', [UserController::class, show);

{user:name}とすることで、nameカラムを基準にすることができます。

Laravel7以降のバージョンで利用できるので念の為バージョンの確認が必要です。

モデルでgetRouteKeyNameメソッドを定義

続いてはモデルで基準カラムを設定する方法です。

対象モデル内で以下のように定義しておきます。

public function getRouteKeyName()
{
    return 'name'; 
}

ルーティングは以下でOKです。

Route::get('/user/{user}', [UserController::class, show);

これでnameカラムを基準にしてUserインスタンスを取得するようになります。

使い所としてはtokenなどをURLにあてて対象のインスタンスを取得したいときなどに使えるかと思います。

Laravelのバージョンも気にする必要もありません。

モデルでgetRouteKeyNameメソッドを定義すると、ルーティングから対象のインスタンスを取得する場合はその定義が適用されます。

1箇所だけで適用させたい場合などはルーティングで設定する方法を採用しましょう。

ルートモデルバインディングで効率アップ

いかがだったでしょうか。

ルートモデルバインディングを利用すると、効率的にコードが書けるようになります。

可読性もアップするので使っていない場合はぜひ取り入れましょう。

エンジニアにおすすめ書籍

エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!

Laravel
シェアする
エンせいをフォローする
スポンサーリンク
タイトルとURLをコピーしました