Laravel-enumを使ってみた


最近、実務でEnumを使う場面が多かったので、Laravelでenumを使いたい時のメモとしてまとめます。

そもそもEnumって何?って話ですが、これは「列挙型」と呼ばれており、複数の定数をひとまとめにする事が出来ます。

また、「未読・既読」や「公開・非公開」みたいなフラグをboolean型で定義するケースが良くあると思います。実際に格納される値は01だが、文字列として公開 非公開を扱いたい、といったケースにenumは便利です。

参考:列挙型
https://ja.wikipedia.org/wiki/%E5%88%97%E6%8C%99%E5%9E%8B

導入

Laravelでenumを使う際に何種類かパッケージがありますが、今回は、laravel-enumを使ってみます。

[laravel-enum]
https://github.com/BenSampo/laravel-enum#guide

まずは以下コマンドを入力します。これでphp artisan make:enumコマンドが使えるようになります。

$ composer require bensampo/laravel-enum

enum定義

実際にコマンドを入力してenumファイルを作成してみます。

ここでは、以下想定で進めます。
❶ブログ投稿機能で、DBに公開 非公開のflagをboolean型で格納する。
❷実際に格納される値は0 1だが、View上では公開 非公開として表示したい。

以下、コマンドを入力してみましょう。

$ php artisan make:enum PublishState

すると、appディレクトリ配下にenumsディレクトリが作成され、以下ファイルが作成されます。

PublishStatus.php(編集前)
<?php

namespace App\Enums;

use BenSampo\Enum\Enum;

final class PublishStatus extends Enum
{
    const OptionOne = 0;
    const OptionTwo = 1;
    const OptionThree = 2;
}

ディレクトリ作成と同時に、enumsフォルダの中に、上記ファイルが生成されます。
このファイルを以下のように変更していきましょう。

PublishStatus.php(編集後)
<?php

namespace App\Enums;

use BenSampo\Enum\Enum;

final class PublishStateType extends Enum
{
    const Private = 0;
    const Public = 1;

    /**
     * @param mixed $value
     * @return string
     */
    public static function getDescription($value): string
    {
        switch ($value) {
            case self::Private:
                return '非公開';
                brake;
            case self::Public:
                return '公開';
                brake;
            default:
                return self::getKey($value);
        }
    }

    /**
     * @param string $key
     * @return int|mixed
     */
    public static function getValue(string $key)
    {
        switch ($key) {
            case '非公開':
                return 0;
            case '公開':
                return 1;
            default:
                return self::getValue($key);
        }
    }
}

Viewで表示

これで準備完了です。View上で使用してみましょう。

index.php
//非公開
<div>
    {{\App\Enums\PublishStatus::getValue('0')}}
</div>
//公開
<div>
    {{\App\Enums\PublishStatus::getValue('1')}}
</div>

定数の値を取得する事も出来ます。

index.php
//0
<div>
    {{\App\Enums\PublishStatus::getValue('非公開')}}
</div>
//1
<div>
    {{\App\Enums\PublishStatus::getValue('公開')}}
</div>

キーバリューのリストを返す

キーバリューペアのリストを返す事ができるtoSelectArrayというメソッドも用意されています。こちらもselectタグ等で使う場面が結構あるかと思います。Controllerで用意してViewで表示してみます。

BlogContoller.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Enums\PublishStatus;//追加

class BlogController extends Controller
{
    public function index()
    {
        //selectタグに最適なkeyvalueペアのリストを返すメソッドが用意されている
        $status = PublishStatus::toSelectArray();
        return view('enum.index', compact('status'));
    }
}

foreach文でプルダウンフォームを作成

index.blade.php
@foreach($states as $key => $value)
    <select name="" id="">
        <option value="{{$key}}">{{$value}}</option>
    </select>
@endforeach

以上、簡単ですが、復習も兼ねてメモとしてまとめました。
バリデーションルールなども定義できるようなので、ドキュメントをもう少し読んでみようと思います。
https://github.com/BenSampo/laravel-enum#validation