こんにちは!タクマです。
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でも情報発信をしていますので、よかったらフォローをお願いします(^^)