Open3

Laravelのヘルパ関数について調べる

ちびまろちびまろ

routeヘルパ関数

route()はLaravelのヘルパ関数の1つ。
名前付きルートへのURLを生成するために使用される。

routes/web.phpなどで書いたルートの名前を使ってURLを生成するために使われる
↓で言うと->name('home')の部分。

Route::get('/home', [HomeController::class, 'index'])->name('home');

第二引数について

route()の第二引数へパラメータを渡すことで、リンク先へパラメータを渡すことができる。

echo route('post.show', ['post' => 1]);
// http://example.com/post/1

route()を使って、複数のパラメータを持つルートのURLを生成することもできる

Route::get('/post/{post}/comment/{comment}', function (Post $post, Comment $comment) {
    // ...
})->name('comment.show');

echo route('comment.show', ['post' => 1, 'comment' => 3]);

// http://example.com/post/1/comment/3

ルートで定義していない過剰な配列要素は、URLのクエリ文字列として処理される。

echo route('post.show', ['post' => 1, 'search' => 'rocket']);

// http://example.com/post/1?search=rocket

引用元

疑問

  • 第二引数で渡せるのはid的なキーだけ?
ちびまろちびまろ

疑問について調べた

どうやらパラメータとしてEloquentモデルも渡せるらしい。
多分こんな感じで使える

public function edit(Post $post)
{
    echo route('post.show', ['post' => $post]);
}

さらにrouteヘルパによってモデルのルートキー(主キー)を自動的に抽出するらしい。

ちびまろちびまろ

Route::resourceメソッド

ヘルパ関数じゃないけどLaravel独自のRouteファサードにあるメソッド。
1つ上のスレッドでEloquentモデルも渡していたので気になって調べた。

resourceメソッドを使わない場合はこの通り

Route::get('/users/{user}', [UserController::class, 'show'])->name('users.show');

このルートにはusers.showという名前が付いており、URLが'/users/{user}'、UserControllerのshowメソッドが実行される。

{user}は動的パラメーターであり、今回の場合ユーザーIDに置き換わる。

route()での応用

さっきまではroute('post.show', ['post' => 1])でidを指定して渡していた

Route::resourceを使ったらコントローラーではこう書ける
※ルートモデルバインディングを使ってる

public function show(User $user)
{
    route('users.show', $user);
}

ルートモデルバインディングとEloquentモデルのURL生成機能を組み合わせることでLaravelが何やかんや自動的にやってくれるらしい
$userをroute()の第二引数に渡すことでPKを紐づけてくれるよう