環境
Laravel v9.5.1 (PHP v8.1.3)
前提
- User -> Bookは1対多
- Bookのプロパティ:
user_id
title
content
genre
-
genre
はenumで定義されている
app/Enums/Genre.php
namespace App\Enums;
enum Genre: int
{
case Fantasy = 1;
case DetectiveAndMystery = 2;
case Horror = 3;
case Romance = 4;
}
Bad
genreId
をenumで定義している場合、createPost
メソッドのgenreId
の型宣言をint
にしてしまうと、enumに存在しない値が入る可能性がある。
例えばenumには定義されていない5
が入ってしまうとか。
DB上は問題ない値なのでもし5
が入っても保存されてしまうが、一度DBに保存されてしまうとまず気づかないし変更するとしてもかなり大変なことになる。
バグの温床になりかねない。
BookController.php
class BookController extends Controller
{
...
public function store(Request $request): JsonResponse
{
$post = $request->user()->createBook(
$request->title, $request->content, $request->genre_id
);
return response()->json(Response::HTTP_OK);
}
}
User.php
class User extends Model
{
...
public static function createBook(string $title, string $content, int $genreId): void
{
Book::create([
'user_id' => $this->id,
'title' => $title,
'content' => $content,
'genre_id' => $genreId,
]);
}
}
Better
createPost
メソッドのgenreId
の型宣言をGenre
オブジェクトで定義すると、間違って1~4
以外の数字が入ることはない。
DBに間違った値が入る前にアプリケーション側で防ぐことが大切!
User.php
use App\Enums\Genre;
class User extends Model
{
...
public static function createBook(string $title, string $content, Genre $genreId): void
{
Book::create([
'user_id' => $this->id,
'title' => $title,
'content' => $content,
'genre_id' => $genreId,
]);
}
}