2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

PHP 8.1.0から追加された Enum 機能を、Laravel で使ってみます。
「コードの可読性・保守性を上げたい」「定数管理を効率的に行いたい」という場合に有効だと思います。

この記事では、PHPの列挙型のドキュメントや、Laravel 12.x Eloquent:ミューテタ/キャストを参考に、以下のようなケースで Enum の活用例を紹介します。

  • フォーム入力の選択肢
  • バリデーションとの連携
  • DBの保存・表示

※本記事では下記のバージョンを参考にしています。
PHP 8.1.0
Laravel 12.x

PHPのenumって何?

PHP 8.1.0から導入された Enum(列挙型)は、いわゆる「定数の集まり」をオブジェクト指向的に表現できる機能です。

例えばこんな使い方ができます

enum UserType: string
{
    case Admin = 'admin';
    case User  = 'user';
    case Guest = 'guest';
}

従来の定数クラスよりも型安全かつ可読性が高く、条件分岐もしやすいです。

Laravelでの使い方

1. フォームの選択肢として使う

// UserType.php
enum UserType: string {
    case Admin = 'admin';
    case User  = 'user';
    case Guest = 'guest';

    // 表示名(label)を設定
    public function label(): string {
        return match($this) {
            self::Admin => '管理者',
            self::User  => '一般ユーザー',
            self::Guest => 'ゲスト',
        };
    }

    // フォームの選択肢を設定
    public static function options(): array {
        return array_map(fn($case) => [
            // caseで定義した値を取得
            'value' => $case->value,
            // label()で定義した値を取得
            'label' => $case->label(),
        ], self::cases());
    }
}
<!-- form.blade.php -->
<select name="user_type">
    @foreach (\App\Enums\UserType::options() as $option)
        <option value="{{ $option['value'] }}">{{ $option['label'] }}</option>
    @endforeach
</select>

2. バリデーションで使う

$request->validate([
    // 必須 + caseで定義した値を元に存在チェック
    'user_type' => ['required', Rule::in(array_column(UserType::cases(), 'value'))],
]);

3. モデルの属性キャストに使う

// User.php
use App\Enums\UserType;

protected $casts = [
    'user_type' => UserType::class,
];
$user = User::find(1);
echo $user->user_type->label(); // adminユーザーであれば「管理者」が出力される

Tips

// ラベル付き一覧を配列で取得
UserType::options();

// DB保存値からenumインスタンスへ
UserType::from('admin');

// enumからvalueを取得
$user->user_type->value;

// enumから日本語表示用のラベルを取得
$user->user_type->label();

まとめ

Laravel × PHPの Enum を使うことで、以下のようなメリットがあると感じます。

  • 定数の管理が一元化できて読みやすい
  • 型安全になり、コーディングミスが減る
  • Laravelのフォーム・バリデーション・モデルキャストと相性が良い

今まではconfigconstantというディレクトリに定数を置きがちでしたが、定数管理の方法の1つとしてEnumも有効なので、今後も活用していきたいと思います。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?