はじめに
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のフォーム・バリデーション・モデルキャストと相性が良い
今まではconfig
やconstant
というディレクトリに定数を置きがちでしたが、定数管理の方法の1つとしてEnum
も有効なので、今後も活用していきたいと思います。