Laravel

【Laravel】ルートモデルバインディングとは?徹底解説します

タクマ

こんにちは!タクマです。

31歳未経験からエンジニア転職に成功し、

2021年3月より都内の受託開発企業にてWebエンジニアとして働いています。

今回は、Laravelのルートモデルバインディングについて解説します。

今日の内容を最後まで見ていただければ、ルートモデルバインディングを理解でき、便利なことが分かる内容となっております。

ぜひ最後まで読んでいただけると嬉しいです。

ルートモデルバインディングとは?

そもそもルートモデルバインディングとはなんなのでしょうか?

ルートモデルバインディングとは一言で言うと、モデルインスタンスをルートに自動的に挿入するしてくれる便利な機能です。

この説明だけではイメージが湧かないと思うので、実際に例をみてみましょう!

通常の場合

Route::get('/posts/{id}/show', [PostController::class, 'show'])->name('posts.show');
public function show(int $id)
{
        $post = Post::find($id);

    if (is_null($post)) {
            abort(404);
        }

        return view('posts/show', [
            'post' => $post,
        ]);
}

abort関数は引数のレスポンスコードで、コードに対応するエラーページが表示されます。

そしてエラーページが表示されると、以降の処理は実行されません。

この場合、存在しないIDが含まれたリクエストが送られた時に404エラーページを返します。

(URLのidの部分だけ存在しないidに変えることで、存在しないポストIDが含まれたリクエストが送れてしまいます)

ちなみに、abort(404)で404エラーを返す設定をしていない場合、Laravelのエラーページが表示されてしまいます。

ユーザーにLaravelのエラーページを見せるのは良くないですね 。

なので404エラーページを設定しているわけです。

しかし、毎回404エラーを返す(上記PostController.phpのような)記述をするのはとても面倒ですよね。

そこで便利なのがルートモデルバインディングです。

ルートモデルバインディングの場合

Route::get('/posts/{post}/show', [PostController::class, 'show'])->name('posts.show');

まずは先ほどの{id}の部分を{post}に変えます。

public function show(Post $Post)
{
       return view('posts/show', [
            'post' => $post,
        ]);
}

次にpublic function showの引数をint型の$idを受け取る形から、Postクラスの$postを受け取るよう変更します。

これだけで自動的にURLの{post}に、該当するインスタンスのidが入り、Postクラスのインスタンスのページを返してくれます。

また、存在しないIDが含まれたリクエストが送られたときは、404エラーページを表示してくれます。

つまり、コードの量は少なくなりましたが、先ほどの通常の場合と同じ設定をしていることになります。

さいごに

いかがでしたでしょう?

ルートモデルバインディングについて理解していただけましたでしょうか?

ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。

これからもエンジニアの方、プログラミング初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!

Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)

Webエンジニア
タクマ
埼玉県出身の31歳

30歳からプログラミングを始め31歳でWebエンジニアに転職成功。

現在は都内の受託開発企業にてサーバーサイドエンジニアをしています。

\ Follow me /

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA