Laravel 定数・Enumの使い分け
投稿日:2026/01/31
Laravel開発をしていると、必ず出てくるのがこの悩みです。
- この値、直書きでいいの?
- 定数にするべき?Enumにするべき?
- configに置くのは違う?
本記事では、Laravel実務でよくあるケースを元に
定数・Enumの正しい使い分けと設計指針 を解説します。
なぜ定数・Enum設計が重要なのか?
次のようなコード、見覚えはありませんか?
if ($user->status === 1) {
// 有効
}
1の意味が分からない- 変更に弱い
- 条件分岐が増えるほど地獄
👉 意味のある名前を与えること が、保守性を大きく上げます。
定数とEnumの違い(ざっくり)
| 種類 | 特徴 | PHP |
|---|---|---|
| 定数 | 単純・軽量 | PHP 7+ |
| Enum | 型安全・表現力が高い | PHP 8.1+ |
① 定数を使うべきケース
✔ 固定値で種類が増えないもの
例:
- ページネーション件数
- 最大リトライ回数
- 並び順
実装例
class Pagination
{
public const DEFAULT_LIMIT = 10;
}
$posts = Post::paginate(Pagination::DEFAULT_LIMIT);
✔ 単純なフラグ値
class UserStatus
{
public const ACTIVE = 1;
public const INACTIVE = 0;
}
if ($user->status === UserStatus::ACTIVE) {
// ...
}
② Enumを使うべきケース
✔ 状態・種類を明確にしたいとき
- ステータス
- 種別
- ロール
- 支払い状態
PHP 8.1 Enum例
enum UserStatus: int
{
case Active = 1;
case Inactive = 0;
}
if ($user->status === UserStatus::Active) {
// ...
}
メリット
- 型安全(無効な値が入らない)
- IDE補完が効く
- バグが減る
③ 定数で十分なケース / Enumが過剰なケース
| ケース | おすすめ |
|---|---|
| 数値1〜2種類 | 定数 |
| 増える可能性がある | Enum |
| DBと密接 | Enum |
| 表示名が不要 | 定数 |
④ Enum × 表示名
Enumに ラベルを持たせる と一気に実務向けになります。
enum UserStatus: int
{
case Active = 1;
case Inactive = 0;
public function label(): string
{
return match ($this) {
self::Active => '有効',
self::Inactive => '無効',
};
}
}
echo $user->status->label();
⑤ DBとの連携(Eloquent)
キャスト設定
protected $casts = [
'status' => UserStatus::class,
];
これで、
$user->status === UserStatus::Active
が使えます。
⑥ config定数との違い
| 種類 | 役割 |
|---|---|
| config | 環境・設定 |
| 定数 | アプリ仕様 |
| Enum | 状態・種別 |
- ❌ configにビジネスロジックを入れない
- ❌ .envに定数を逃がさない
⑦ よくあるNG設計
❌ 魔法の数字
if ($order->status === 3) {}
❌ .envで定義
ORDER_STATUS_SHIPPED=3
❌ Enumに詰め込みすぎ
enum Status {
// 状態 + 表示 + 色 + 処理…
}
👉 責務を分ける
⑧ おすすめディレクトリ構成
app/
├─ Enums/
│ └─ UserStatus.php
├─ Constants/
│ └─ Pagination.php
判断フローチャート(迷ったらこれ)
-
- 状態・種類か?
- → YES → Enum
- → NO → 定数
-
- 環境差分があるか?
- → YES → config / .env
- → NO → 定数 / Enum
まとめ
Laravelでの定数・Enum設計は、
- 意味をコードに与える
- 変更に強くする
- バグを減らす
ための重要なポイントです。
まずは、
- 魔法の数値を消す
- 状態はEnumで表現する
ここから始めるだけで、 コードの質は一段上がります。