php8.1から追加されたばかりのEnum.
やっとENUMが使えるようになってPHPerもきっと喜んでいることでしょう。
Laravel9で使う方法をまとめます。入門編です。
ステップ1: app/Enumsディレクトリを手動で作る
単純にディレクトリ作ります。
僕はミスってEnumにしましたが、複数のファイルが入るのでEnumsのほうが適切かも。
まぁどっちでも動くから僕は気にしないけれど。
ステップ2:Enumクラスのファイルを作る
php artisanとかでは作れません。手動で作ります。
参考までに僕が作ったソースを公開しときます。
銀行口座の種別(普通と当座)をEnumで管理したときのやつ。
※TOZAとNORMALの名前が英語と日本語で変、というのは気にしないで。
<?php
namespace App\Enum;
enum BankAccountTypeEnum: int
{
case NORMAL = 0;
case TOZA = 1;
private static function string($val): string
{
return match($val){
self::NORMAL, self::NORMAL->value => '普通',
self::TOZA, self::TOZA->value => '当座',
};
}
public function label(): string
{
return self::string($this);
}
public static function search($int): string
{
return self::string($int);
}
}
searchのクラスメソッドを作ってます。
0や1などのvalueから検索したい場面があったため作ったメソッドです。
値からEnumの日本語の値を取得しています。地味に便利だと思います。
match文を知らない人もいると思います。
match($val){
式1, 式2 => 'aaa',
式a, 式b => 'bbb',
}
$valが式1,2のどちらかと一致したときに => の右側を返す、というものです。
一致すれば下の式a,bは評価せずにreturnされます。
あと、もし使っているエディタがvs codeだとエラーの赤いアンダーラインが入ります。
これはもう気にしないことにしよう。いつかvscodeが対応するから。
ステップ3:モデルファイルの$castsに入れる
これしておきましょう。
BankAccount::find(1)->type
ってやったときにEnumのオブジェクトにlaravelが自動で変換してくれます。
use App\Enums\BankAccountTypeEnum;をするのを忘れずに。
これで設定はOKです。
こんな感じになります。
よく使う使い方もこちらにまとめておきます。
BankAccount::find(1)->type; // BnakAccountTypeEnum
BankAccount::find(1)->type->value; // 0 or 1
BankAccount::find(1)->type->name; // NORMAL or TOZA
BankAccount::find(1)->type->label(); // 普通 or 当座
BankAccountTypeEnum::search(1); // 当座
BankAccount::find(1)->type == BankAccountTypeEnum::NORMAL // boolean
Enumのオブジェクトはnameとvalueのプロパティを持っています。
これだけ理解しておけばLaravelでEnumを使うことができると思います。
>>> App\Enum\BankAccountTypeEnum::NORMAL
=> App\Enum\BankAccountTypeEnum {#4907
+name: "NORMAL",
+value: 0,
}
まとめ
Enumのポイントはmatch文かなと。これ僕知らなかったんですよ。
Enumと直接ではありませんが、Enumが登場したことで多用されるのでこの機会に理解しちゃいましょう。
https://www.php.net/manual/ja/control-structures.match.php
またlaravelのモデルで$castsに入れるあたりの公式リファレンスはこちら
https://laravel.com/docs/9.x/releases#enum-casting