LaravelでBacked Enumを用いた際に、valueからcaseを参照する方法
に公開
概要
Laravel で Backed Enum を用いた際に個人的に詰まったポイントがあったので、まとめました。
目的
Laravel で Backed Enum に定義したvalue
からlabel
を参照する
例
SuitID
が1のcase
を参照する- 参照した
case
に対してlabel
メソッドを用いてラベル名を取得する。 - 下記 Enum の場合、ハートが返却されること
<?php
namespace App\Enums
enum Suit
{
case Hearts = 1;
case Diamonds = 2;
case Clubs = 3;
case Spades = 4;
public function label(): string
{
return match ($this) {
Suit::Hearts => 'ハート',
Suit::Diamonds => 'ダイヤモンド',
Suit::Clubs => 'クラブ',
Suit::Spades => 'スペード',
}
}
}
結論
from
メソッドの引数にvalue
を指定することで、取得できる。
use App\Enum\Suit; // 取得したいSuitのvalueを指定する $suit_value = 1; // valueから該当のSuitを取得し、labelメソッドでラベル名を取得する $suit_label = Suit::from($suit_value)->label();
PHP8.1 から追加された Enum について
Enum 型を使えば、簡単に 複数の定数を定義できます。
定義例
<?php namespace App\Enums enum Suit { case Hearts; case Diamonds; case Clubs; case Spades; }
Backed Enum
Enum 型に値を持たせることもできます。
値に依存した Enum をBacked Enum
と呼びます。
<?php namespace App\Enums enum Suit { case Hearts = 1; case Diamonds = 2; case Clubs = 3; case Spades = 4; }
参照方法
Backed Enum
に定義した内容は、以下のようにEnumのクラス名
+変数名
+value
で参照できます。
<?php
use App\Enum\Suit;
Route::get('/', function () {
var_dump(Suit::Hearts->value)
// 1
});
また、下記のように新たにメソッドを定義することもできます。
label メソッドの例
- 日本語名を返却する
labelメソッド
を追加しました。
<?php
namespace App\Enums
enum Suit
{
case Hearts = 1;
case Diamonds = 2;
case Clubs = 3;
case Spades = 4;
public function label(): string
{
return match ($this) {
Suit::Hearts => 'ハート',
Suit::Diamonds => 'ダイヤモンド',
Suit::Clubs => 'クラブ',
Suit::Spades => 'スペード',
}
}
}
定義した内容は、以下のようにEnumのクラス名
+変数名
+メソッド名
で参照できます。
<?php
use App\Enum\Suit;
Route::get('/', function () {
var_dump(Suit::Hearts->label())
// 1
});
本題
Hearts
のvalue
とlabel
を取得する場合は上記の方法で可能ですが、value
が 2
のcase
を取得したい場合は、どうすれば良いでしょうか?
方法
Backed Enum にはfrom メソッドがあり、value を引数にしてすることで、該当のcase
を参照することができます。
use App\Enum\Suit; // 取得したいSuitのvalueを指定する $suit_value = 1; // valueから該当のSuitを取得し、labelメソッドでラベル名を取得する $suit_label = Suit::from($suit_value)->label();