概要#
Laravel学習で自分がつまずいた部分を備忘録としてまとめています。
今回はデータの受け渡しに関する記事です。
つまずいたポイント#
記事投稿型の簡易アプリ作成時につまずいた問題です。
記事一覧ページ→記事の詳細ページに移る際、
ビュー→コントローラに投稿のデータを渡すにはどうしたら良いのか?
下記2つの方法で解決出来たので記事にしてみました。
①ルートパラメータ####
②Implicit Binding####
以下、記事内容です!
ルートパラメータ#
まず渡し方の1つがルートパラメータを用いた方法です。
■ビュー
@foreach ($posts as $post)
<li>
<a href="/posts/{{ $post->id }}">{{ $post->title }}</a>
</li>
@endforeach
まず、ビュー上でURLを用いて、ルーティングに投稿のIDを渡します。
■ルーティング
Route::get('/posts/{id}','PostsController@show')
ここからがルートパラメータを用いた方法です。URLの中に{ }
を設定します。
この{ }
の中身がパラメータと言う扱いになり、アクション内でこのパラメータが使用可能になります。
仮で{ }
の中身を{id}
と設定していますが、中身にはビューで設定した$post->id
が入ってきます。
※{ }は変数扱いなので、中身の文字はわかりやすい単語でOK
【例】'/post/test'
でアクセスした場合 → 「test」
がパラメータ扱い
'/post/1'
でアクセスした場合 → 「1」
がパラメータ扱い
■コントローラ
//アクションの引数にパラーメータを設定
public function show($id) {
//パラメータをアクション内で使用出来る
$post = Post::find($id);
return view('posts.show')->with('post', $post);
}
アクションの引数の中に先ほどのパラメータを代入する事で、
アクション内でそのパラメータが使用可能になります。
上記のshowアクションでは、
パラメータを元にfindメソッドで該当の記事データを再取得→
記事データを渡しつつ投稿の詳細画面を表示することが出来ました。
Implicit Binding##
次はImplicit Binding
です。
ルートパラメータの場合、URLに書かれた文字列だけをコントローラに渡しました。
Implicit Bindingの場合は、投稿を丸ごと渡すことが出来ます。
下記、その手順です。
■ビュー
@foreach ($posts as $post)
<li>
<a href="/posts/{{ $post }}">{{ $post->title }}</a>
</li>
@endforeach
URLに$post
を指定します。
■ルーティング
Route::get('/posts/{post}', 'PostsController@show')
先述のルートパラメータで{post}
を指定します。
■コントローラー
public function show(Post $post) {
return view('show')->with('post',$post);
}
アクションの引数を(Post $post)
に指定→投稿の中身を$post
で使用できます。
先ほどと違い、アクション内で投稿を再取得せずに$post
をそのまま記事詳細画面に渡すことが出来ました。楽ちんですね。
まとめ##
以上、Laravelにおけるビュー→コントローラへデータの渡し方でした。
Implicit Bindingの方が書くコードの量が少なくなるので効率的ですね。
最後まで読んで頂きありがとうございました!