Laravelでphp8.1から追加されたEnumを使う方法の入門|モデルのcasts配列に設定する

php8.1から追加されたばかりのEnum.

やっとENUMが使えるようになってPHPerもきっと喜んでいることでしょう。

Laravel9で使う方法をまとめます。入門編です。

ステップ1: app/Enumsディレクトリを手動で作る

単純にディレクトリ作ります。

僕はミスってEnumにしましたが、複数のファイルが入るのでEnumsのほうが適切かも。

まぁどっちでも動くから僕は気にしないけれど。

Enumディレクトリ

 

ステップ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が対応するから。

Enumクラスはvsコードで赤いエラーが出る

ステップ3:モデルファイルの$castsに入れる

これしておきましょう。

BankAccount::find(1)->type ってやったときにEnumのオブジェクトにlaravelが自動で変換してくれます。

laravelのmodelの$castsの配列にenumを設定

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