0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

今回始めて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 の使用条件

  1. ルーティングのパラメータ名とモデルの変数名が一致していること

    • ルートで定義されたパラメータ(例: {post})の名前と、コントローラーのメソッド引数の名前(例: $post)が同じである必要があります。
  2. コントローラーの引数にモデルの型が指定されていること

    • コントローラーのメソッド引数で、対象となるモデル(例: Post)を明示的に指定します。
  3. モデルに対して RouteServiceProvider によるバインディングが可能であること

    • デフォルトでは、モデルの主キー(id)を利用して解決します。
    • モデル内でカスタムのルートキーを使用したい場合は、getRouteKeyName メソッドをオーバーライドします。

※3つ目に関しては初学者のうちは気にしなくていいと思います。
使う機会ができたらその時勉強しましょう。

まとめ

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?