列挙型(Enum)とは
列挙型(Enumerations)または Enum を使うと、 開発者は取りうる値を限定した独自の型を定義できます。 これによって、"不正な状態を表現できなくなる" ので、 ドメインモデルを定義する時に特に役立ちます。
ざっくりいうと、「決まった値だけを許したい」時に使うのが列挙型(Enum)になります。
参考ページ
前提条件
- PHP 8.4.8
- Laravel 12.19.3
Enumファイルの作り方
Enumファイルを作るコマンド
php artisan make:enum SampleEnum
実際のコード
動作検証の為、コントローラーから呼び出しています。
Enumから値を呼び出す方法
<?php
namespace App\Http\Controllers;
use App\Enums\SampleEnum;
use Illuminate\Http\Request;
class EnumTestController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(Request $request)
{
// Enumの値を取得
var_dump(SampleEnum::Pending->value);
// string(7) "pending"
// Enumの名前を取得
var_dump(SampleEnum::Pending->name);
// string(7) "Pending"
// Enumの値を配列で取得(cases()との違いは、valuesは自分で定義する必要がある)
var_dump(SampleEnum::values());
// array(3) { [0]=> string(7) "pending" [1]=> string(10) "processing" [2]=> string(9) "completed" }
// Enumの値を配列で取得(定義されている全てのcaseを宣言された順に含めた配列)
var_dump(SampleEnum::cases());
// array(3) { [0]=> enum(App\Enums\SampleEnum::Pending) [1]=> enum(App\Enums\SampleEnum::Processing) [2]=> enum(App\Enums\SampleEnum::Completed) }
// Enumをキーと値のペアで取得
var_dump(SampleEnum::forSelect());
// array(3) { ["pending"]=> string(7) "Pending" ["processing"]=> string(10) "Processing" ["completed"]=> string(9) "Completed" }
// Enumの値を取得(対応するcaseがない場合はエラー)
var_dump(SampleEnum::from('pending')->value);
// string(7) "pending"
// Enumの値を取得(対応するcaseがない場合はnullを返す)
var_dump(SampleEnum::tryFrom('pending')->value);
// string(7) "pending"
var_dump(SampleEnum::tryFrom('Invalid') ?? 'Invalid value');
// string(13) "Invalid value"
// Enumのlabelを取得(自作でgetLabelメソッドを使って取得)
var_dump(SampleEnum::getLabel('pending') ?? null);
// string(12) "処理待ち"
}
}
Enumファイルの中身
<?php
namespace App\Enums;
use App\Enums\EnumTrait;
enum SampleEnum: string
{
use EnumTrait;
case Pending = 'pending';
case Processing = 'processing';
case Completed = 'completed';
/**
* label
*
* @return string
*/
public function label(): string
{
return match($this) {
self::Pending => '処理待ち',
self::Processing => '処理中',
self::Completed => '完了',
};
}
}
Enumファイルは複数存在すると思うので、Traitファイルを作って、それぞれのEnumファイルに組み込む為に作成しています。
公式リファレンス
Traitファイル
<?php
namespace App\Enums;
trait EnumTrait
{
/**
* 値を配列で取得
*
* @return array
*/
public static function values(): array
{
return array_column(self::cases(), 'value');
}
/**
* 全てのcaseを宣言された順に含めた配列を取得
*
* @return array
*/
public static function forSelect(): array
{
return array_column(self::cases(), 'name', 'value');
}
/**
* Enumの値を取得
*
* @param mixed $value
* @return string
*/
public static function getLabel(string $value): string
{
return self::tryFrom($value)->label() ?? '';
}
}