[初学者向け/Laravel]どうせならとことん楽をしようよって話。

## はじめに
今回始めてLaravelを学習してみました。
Laravelを使ったWebアプリケーション開発では、効率よくコードを書くための仕組みが豊富に用意されていますが、
初学者でも簡単に扱えてなおかつややこしい！と感じる部分を大きく軽減できそうな2つをご紹介。

- **`Route::resource`**: RESTfulなルートを自動生成
- **Implicit Binding**: モデルデータを自動的に解決
## 1.`Route::resource` を使った効率的なルーティング

### 手動でルートを設定する場合
通常、ルーティングを手動で設定すると以下のようなコードが必要です。

```php
Route::get('/posts', [PostController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
Route::get('/posts/create', [PostController::class, 'create']);
Route::get('/posts/{post}', [PostController::class, 'show']);
Route::put('/posts/{post}', [PostController::class, 'update']);
Route::delete('/posts/{post}', [PostController::class, 'destroy']);
```
### Route::resource を使うとどうなる？

実はこれ、ルートを自動生成する **`Route::resource`** を使うことでこれらを一行で記述できます。
学習中の方ならご存知かもしれませんがCRUDに対応したルーティングをしてくれてるんですね。
```php
Route::resource('posts', PostController::class);
| HTTPメソッド   | URL                  | コントローラーメソッド | 用途                  |
|----------------|----------------------|------------------------|-----------------------|
| GET            | `/posts`             | `index()`              | 投稿の一覧を表示する   |
| GET            | `/posts/create`      | `create()`             | 投稿の作成フォーム     |
| POST           | `/posts`             | `store()`              | 投稿を保存する         |
| GET            | `/posts/{post}`      | `show()`               | 特定の投稿を表示する   |
| GET            | `/posts/{post}/edit` | `edit()`               | 投稿の編集フォーム     |
| PUT/PATCH      | `/posts/{post}`      | `update()`             | 投稿を更新する         |
| DELETE         | `/posts/{post}`      | `destroy()`            | 投稿を削除する         |
```
コードもスッキリして見やすいし、何より簡単。これなら簡単にルーティングできそうですよね。
ちなみに`php artisan route:list --name=(ルート名)`でルーティングが確認できます。
それに従ってコントローラーなどの設定を進めてあげましょう。
ちなみにこの構文を使った場合ルートURLが設置されません。
ルートURLは勿論ですが、必要に応じて自動生成の対象から外してあげましょう。
```php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
Route::get('/', action: [PostController::class,'index'])->name('posts.index');
	//　1：ルートURLを設定
Route::resource('posts',controller: PostController::class)->except(['index']);
　// 2: テンプレートの中に自動生成の除外対象を設定(カンマ区切りで複数個設定可能)
 ```
## 2.Implicit Binding を使ったモデルデータの簡単取得

### 手動でデータを取得する場合
通常、IDをもとにモデルデータを取得するには以下のようなコードが必要です。
データベースに保管されたデータを取り出して画面に表示させたいときなんかですね。

```php
public function show($id)
{
    $post = Post::findOrFail($id);
    return view('posts.show', compact('post'));
}
```
データベースから検索→戻り値を返すって形です。
でもどうせならもっと楽したいですよね。
### Implicit Binding を使うとどうなる？

Implicit Bindingを使うと、IDから自動的にモデルインスタンスを解決できます。
言わばLaravelが察してくれるわけです。

### ルート設定
```php
Route::get('/posts/{post}', [PostController::class, 'show']);
```
### コントローラー
```php
public function show(Post $post)
{
    return view('posts.show', compact('post'));
}
```
`{post} `に渡されたIDが自動的に Post モデルにバインドされ、`$post` にインスタンスが注入されます。
クエリの記述が不要になり、コードがスッキリします。
便利なImplicit Bindingですが、利用するためにこの条件だけはクリアしてあげる必要があります。
### Implicit Binding の使用条件

1. **ルーティングのパラメータ名とモデルの変数名が一致していること**  
   - ルートで定義されたパラメータ（例: `{post}`）の名前と、コントローラーのメソッド引数の名前（例: `$post`）が同じである必要があります。

2. **コントローラーの引数にモデルの型が指定されていること**  
   - コントローラーのメソッド引数で、対象となるモデル（例: `Post`）を明示的に指定します。

3. **モデルに対して `RouteServiceProvider` によるバインディングが可能であること**  
   - デフォルトでは、モデルの主キー（`id`）を利用して解決します。
   - モデル内でカスタムのルートキーを使用したい場合は、`getRouteKeyName` メソッドをオーバーライドします。

※3つ目に関しては初学者のうちは気にしなくていいと思います。
使う機会ができたらその時勉強しましょう。
## まとめ
そもそもPHPでの開発を楽にするためのフレームワークですが、細かい工夫で更に楽ができます。
楽ができる=脳のリソースを他に回せる　ということでもあるので、せっかくなら楽しちゃいましょう。
今回約2週間かけてフレームワークを学習しましたが、いちばん大事なのは
｢その場で(大事)完全に理解しようとする必要はない｣というマインドで挑むことな気がしました・・・。
細かいことまで理解しようとすると本当にキリがありません。気楽にやってみましょう。
学習中の皆様の一助になれば幸いです。それでは。