🦔
LaravelでBacked Enumを用いた際に、valueからcaseを参照する方法
概要
Laravel で Backed Enum を用いた際に個人的に詰まったポイントがあったので、まとめました。
目的
Laravel で Backed Enum に定義したvalueからlabelを参照する
例
-
SuitIDが1のcaseを参照する - 参照した
caseに対してlabelメソッドを用いてラベル名を取得する。 - 下記 Enum の場合、ハートが返却されること
app/Enums/Suit.php
<?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 型を使えば、簡単に 複数の定数を定義できます。
定義例
app/Enums/Suit.php
<?php
namespace App\Enums
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
Backed Enum
Enum 型に値を持たせることもできます。
値に依存した Enum をBacked Enumと呼びます。
app/Enums/Suit.php
<?php
namespace App\Enums
enum Suit
{
case Hearts = 1;
case Diamonds = 2;
case Clubs = 3;
case Spades = 4;
}
参照方法
Backed Enumに定義した内容は、以下のようにEnumのクラス名+変数名+valueで参照できます。
routes/web.php
<?php
use App\Enum\Suit;
Route::get('/', function () {
var_dump(Suit::Hearts->value)
// 1
});
また、下記のように新たにメソッドを定義することもできます。
label メソッドの例
- 日本語名を返却する
labelメソッドを追加しました。
app/Enums/Suit.php
<?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のクラス名+変数名+メソッド名で参照できます。
routes/web.php
<?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();
参考文献
公式ドキュメント
記事作成時に参考にさせていただいたブログ様
Discussion