Route Model Bindingとは
自分は暗黙の結合やルートモデル結合と良く言っています
今までのLaravelでのルートモデル結合ではid
を指定する感じでした
下記のような感じです
ルートでこのように定義して
Route::get('/user/{user}', 'UserController@index');
コントローラーでこんな感じ
public function index(User $user)
{
//
}
これでブラウザから/user/1
などど叩くとUserモデルのidが1のモデルと勝手に結合してくれるものでした
これかLaravel7では新しくid以外のものを指定してできるようになってました
ルートモデル結合について詳しくはこちらをご覧ください→こちら
id以外のフィールドを指定する
id以外のフィールドを指定してルートモデル結合するにはこんな感じで書きます
Route::get('/user/{user:name}', 'UserController@index');
これで/user/{任意の名前}
でURLを叩くことで
その{任意の名前}
と一致するUserが結合して所得することができるようになっています
実際にサンプルを作ってみました
サンプルを作成する
まずはモデル、コントローラー、シーダ、マイグレーションを作成します
$ php artisan make:model Person --all
次にコントローラーですがリソースコントローラーが作成されていますが今回は使わず
別でコントローラーを作成します
$ php artisan make:controller PersonController
シーダファイルを編集します
<?php
use Illuminate\Database\Seeder;
class PersonSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$param = [
'name' => '太郎'
];
DB::table('people')->insert($param);
$param = [
'name' => '花子'
];
DB::table('people')->insert($param);
$param = [
'name' => '次郎'
];
DB::table('people')->insert($param);
}
}
マイグレーションの編集をします
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePeopleTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('people', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('people');
}
}
マイグレーション実行とシーダの実行をします
$ php artisan migrate
$ php artisan db:seed
これでDBとダミーデータの用意ができました
次にbladeファイルを作成します
resources
にmain
フォルダを作成してindex.blade.php
を作成してください
index.blade.php
を下記のように編集しておきます
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>ユーザー表示</title>
</head>
<body>
{{ $person->name }}
</body>
</html>
web.php
を編集します
下記を追加
Route::get('/{person:name}', 'MainController@index');
コントローラーを変更します
MainController.php
に下記のアクションを追加してください
public function index(Person $person)
{
return view('main.index', compact('person'));
}
完了です
これでブラウザから/太郎
としてみてください
ブラウザに太郎
と表示されていると思います
今回はnameフィールドでバインドするように指定しているので
Personモデルに一致するnameをURLに指定してアクセスすると
一致したPersonの情報が所得できています
今までのようにid
のみでなく
ルート定義の際にあんなに簡単にフィールドを指定してルートモデル結合できるのは
とても便利ですね
色々な使い方ができるなと思いました
使い方考えながら遊んでみようと思います