はじめに
今回始めてLaravelを学習してみました。
Laravelを使ったWebアプリケーション開発では、効率よくコードを書くための仕組みが豊富に用意されていますが、
初学者でも簡単に扱えてなおかつややこしい!と感じる部分を大きく軽減できそうな2つをご紹介。
-
Route::resource
: RESTfulなルートを自動生成 - Implicit Binding: モデルデータを自動的に解決
1.Route::resource
を使った効率的なルーティング
手動でルートを設定する場合
通常、ルーティングを手動で設定すると以下のようなコードが必要です。
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に対応したルーティングをしてくれてるんですね。
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
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をもとにモデルデータを取得するには以下のようなコードが必要です。
データベースに保管されたデータを取り出して画面に表示させたいときなんかですね。
public function show($id)
{
$post = Post::findOrFail($id);
return view('posts.show', compact('post'));
}
データベースから検索→戻り値を返すって形です。
でもどうせならもっと楽したいですよね。
Implicit Binding を使うとどうなる?
Implicit Bindingを使うと、IDから自動的にモデルインスタンスを解決できます。
言わばLaravelが察してくれるわけです。
ルート設定
Route::get('/posts/{post}', [PostController::class, 'show']);
コントローラー
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
{post}
に渡されたIDが自動的に Post モデルにバインドされ、$post
にインスタンスが注入されます。
クエリの記述が不要になり、コードがスッキリします。
便利なImplicit Bindingですが、利用するためにこの条件だけはクリアしてあげる必要があります。
Implicit Binding の使用条件
-
ルーティングのパラメータ名とモデルの変数名が一致していること
- ルートで定義されたパラメータ(例:
{post}
)の名前と、コントローラーのメソッド引数の名前(例:$post
)が同じである必要があります。
- ルートで定義されたパラメータ(例:
-
コントローラーの引数にモデルの型が指定されていること
- コントローラーのメソッド引数で、対象となるモデル(例:
Post
)を明示的に指定します。
- コントローラーのメソッド引数で、対象となるモデル(例:
-
モデルに対して
RouteServiceProvider
によるバインディングが可能であること- デフォルトでは、モデルの主キー(
id
)を利用して解決します。 - モデル内でカスタムのルートキーを使用したい場合は、
getRouteKeyName
メソッドをオーバーライドします。
- デフォルトでは、モデルの主キー(
※3つ目に関しては初学者のうちは気にしなくていいと思います。
使う機会ができたらその時勉強しましょう。
まとめ
そもそもPHPでの開発を楽にするためのフレームワークですが、細かい工夫で更に楽ができます。
楽ができる=脳のリソースを他に回せる ということでもあるので、せっかくなら楽しちゃいましょう。
今回約2週間かけてフレームワークを学習しましたが、いちばん大事なのは
「その場で(大事)完全に理解しようとする必要はない」というマインドで挑むことな気がしました・・・。
細かいことまで理解しようとすると本当にキリがありません。気楽にやってみましょう。
学習中の皆様の一助になれば幸いです。それでは。