はじめに
Laravelでは、決められた変数名が、ルートセグメント名と一致するルートと、コントローラーアクションで定義されたEloquentモデルを自動的に紐付けるようだ。
便利なんだろうけど、少し難しいので整理する。
具体的な動き
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
この場合、$user変数は“` App\User “` モデルとしてタイプされ、変数名は“` {user}“` URLセグメントと一致するため、LarvelはリクエストURIの対応する値と、一致するIDをもつモデルインスタンスを自動的に挿入する。
一致するモデルインスタンスが見つからない場合は、404 status codeを返却する。
サンプルコード
database
router
<?php
Route::get('/', 'PostsController@index');
// 通常の書き方
//Route::get('/posts/{id}','PostsController@show');
// Implicit Bindingを使った書き方
Route::get('/posts/{post}', 'PostsController@show');
Controller
<?php
namespace App\Http\Controllers;
use App\Post;
class PostsController extends Controller
{
public function index(){
$posts = Post::all();
return view('posts.index')->with('senddata', $posts);
}
// 通常の書き方
// public function show($id){
// $posts = Post::findOrFail($id);
// return view('posts.show')->with('posts', $posts);
// }\
// Implicit Bindingを使った書き方
public function show(Post $post){
return view('posts.show')->with('posts', $post);
}
}
blade file
<!DOCUMENT html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>this is title</title>
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div class='container'>
<h1> {{ $posts->title}} </h1>
<p>{!! nl2br(e($posts->body)) !!} </p>
</dev>
</body>
</html>
<!DOCUMENT html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>this is title</title>
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div class='container'>
<h1> this is it!</h1>
<ul>
@forelse ($senddata as $data)
<!--通常の書き方
<li> <a href="{{ action('PostsController@show', $data->id) }} "> {{ $data->title }} </a></li>
-->
<!--Implicit Bindingを使った書き方-->
<li> <a href="{{ action('PostsController@show', $data) }} "> {{ $data->title }} </a></li>
@empty
empty!
@endforelse
</ul>
</dev>
</body>
</html>
結果
参考情報
https://laravel.com/docs/5.5/routing#implicit-binding