ウェブ制作

バックエンド

Enumを使ってみる【PHP】

お刺身@プログラマー

お刺身@プログラマー

#Oookey_blog_015

Enumを使ってみる【PHP】

こんにちは。
今回はPHPのEnumをLaravelで使ってみます。
ちなみにEnumの語源はenumeration(イニューマレイト)ですが、イーナムと呼ぶことが比較的多いそうです。

前置きはこれくらいに、Enumを実際に触っていきましょう。

目次

1. Enumとは
2. 実装例
Enumsを作成
Casts設定
Selcetboxでリスト表示
テーブル情報を元に表示

まとめ

参考

1. Enumとは

Enumとは、「特定の限られた選択肢を定義できる型」のことです。
ユーザー種別・性別・学年などの定義済みである選択肢を使う場面で、安全性が高く使い勝手がいいです。

また、PHPにおけるEnumは2種類あります。
・値を持てないEnum = Pure Enum
・値を持てるEnum = Backed Enum

Pure Enum

Copied!

copyBtn
<?php
namespace App\Enums;

enum PayBackPoints
{
    case Bronze;
    case Silver;
    case Gold;
}

Backed Enum

Copied!

copyBtn
<?php
namespace App\Enums;

enum PayBackPoints: string
{
    case Bronze = 'bronzeだよ';
    case Silver = 'silverだよ';
    case Gold = 'goldだよ';
}

基本的にLaravelではBacked Enumを使っていきます。

Backed Enumには制約があります。
・integer or stringのみ
・重複不可(ユニーク)
・単一の型のみ

Backed Enumでそれぞれの値とキーを取り出すには下記のようになります。

Copied!

copyBtn
<?php
// キーを取り出す
echo PayBackPoints::Bronze->name;
// 表示:Bronze


// 値を取り出す
echo PayBackPoints::Bronze->value;
// 表示:bronzeだよ

2. 実装例

ここでは会員ランクごとのポイント返還率を設定していきます。

Enumsを作成

app/Enums/PayBackPoints.phpを作成し、下記のようにcase(選択肢)設定を行います。

Copied!

copyBtn
<?php
namespace App\Enums;


enum PayBackPoints: string
{
    case Bronze = 'bronze';
    case Silver = 'silver';
    case Gold   = 'gold';
}

型指定はstring。
それぞれのキーと値を設定しています。

次にEnumにランクごとのポイント還元率の関数を実装します。

Copied!

copyBtn
<?php
namespace App\Enums;


enum PayBackPoints: string
{
    case Bronze = 'bronze';
    case Silver = 'silver';
    case Gold = 'gold';


    public function MembersRankPoint(): float
    {
        return match ($this) {
            self::Bronze => 0.01,
            self::Silver => 0.05,
            self::Gold => 0.1,
        };
    }
}

Casts設定

次にmodelでCasts設定を行います。

Copied!

copyBtn
<?php
use APP\Enums\PayBackPoints;

class User
{
    protected $casts = [
        'member_rank' => PayBackPoints::class,
    ];
}

これで自動変換できるようになりました。

Selcetboxでリスト表示

controller

Copied!

copyBtn
<?php
public function index(): view
{
   // 会員ランクの一覧表示
    $member_ranks = PayBackPoints::cases();

    return view('test', ['member_ranks' => $member_ranks]);
}

cases()はcaseをすべて取得します。

view

Copied!

copyBtn
<?php
<select name="memberRank">
@foreach($member_ranks as $rank)
    <option value="{{ $rank }}">{{ $rank }}</option>
@endforeach
</select>

表示結果イメージ

テーブル情報を元に表示

controller

Copied!

copyBtn
<?php
public function index(): view
{
   // ユーザーの会員ランクとポイント還元率
    $user = User::find(1);
    $userRank = $user->member_rank->name;
    $userPoint = $user->member_rank->MembersRankPoint();


    return view('test', ['userRank' => $userRank, 'userPoint' => $userPoint]);
}

view

Copied!

copyBtn
<p>あなたの会員は{{ $userRank }}です。ポイント還元率{{ $userPoint }}になります</p>

※member_rankカラムの値はgoldで進めています。

まとめ

PHPのEnumをLaravelで扱ってみましたがいかがでしたでしょうか。
今までconfig勢だった自分にとってはかなり扱いが楽になるようになりました。
紹介しきれませんでしたが、Enumには定数値の有無チェックのtry, tryFromなどのメソッドが
用意されていたり、インターフェースでの実装なども可能です。
いずれはインターフェースとEnumを併せた実装をご紹介できればと思います。
それではまた。