Laravel-enumを使ってみた

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

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

また、「未読・既読」や「公開・非公開」みたいなフラグを`boolean型`で定義するケースが良くあると思います。実際に格納される値は`0`か`1`だが、文字列として`公開` `非公開`を扱いたい、といったケースに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ディレクトリが作成され、以下ファイルが作成されます。
<img width="316" alt="スクリーンショット 2019-08-25 16.08.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33632/4ac040e9-526d-70e7-edf0-0b16f6c64773.png">

```php: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フォルダの中に、上記ファイルが生成されます。
このファイルを以下のように変更していきましょう。

```php: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上で使用してみましょう。

```php:index.php
//非公開
<div>
    {{\App\Enums\PublishStatus::getValue('0')}}
</div>
//公開
<div>
    {{\App\Enums\PublishStatus::getValue('1')}}
</div>
```
定数の値を取得する事も出来ます。

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

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

```php: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文でプルダウンフォームを作成

```php: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