Laravel6でlaravel-enumを使ってみる

今回Laravel6でlaravel-enumを導入してみたので、使い方までを簡単にまとめました。
なぜ、導入したくなったのかというと、``config/const.php``に定数をずらずらと書いていくとプロジェクトが大きくなっていくにつれて見づらいのと、実際に定数から取得するときに``config('const.enum.SPORT.BASEBALL')`` のように全て手入力しないといけないのがつらいと思ったからです。

## Laravel-enumの導入
laravelのバージョンが6の場合に対応しているバージョンの関係で導入するのに苦労しましたが、以下の記事で解決できました。
https://qiita.com/ntm718/items/c10ac1b67e185db36df0

```
composer require bensampo/laravel-enum: ^1.3
```

## enumファイルの作成
最新のバージョンのREADMEを見ながら進めてしまうと、v1.3と所々異なる部分があるので、[README]
(https://github.com/BenSampo/laravel-enum/blob/272377a29c85f20d66b4bcd2605474e7474a0d51/README.md)のバージョンのREADMEを確認したほうが良いです。

```
php artisan make:enum SportType
```
上記コマンドを実行すると、app/Enumsディレクトリに```SportType.php```が作成されます。

```php
<?php

namespace App\Enums;

use BenSampo\Enum\Enum;

/**
 * @method static static getDescription()
 * @method static static getValue()
 */
final class SportType extends Enum
{
    const BASEBALL= 0;
    const FOOTBALL= 1;
    const BASKETBALL = 2;
    const GOLF = 3;

    /**
     * Get sport type description
     * 
     * @param $value
     * @return string
     */
    public static function getDescription($value): string
    {
        if($value === self::BASEBALL){
            return '野球';
        }

        if($value === self::FOOTBALL){
            return 'サッカー';
        }

        if($value === self::BASKETBALL){
            return 'バスケットボール';
        }

        if($value === self::GOLF){
            return 'ゴルフ';
        }
        
        return parent::getDescription($value);
    }

    /**
    * Get sport type value
    *
    *@param $key
    *@return int
    */
    public static function getValue(string $key)
    {
        if($key === '野球'){
            return self::BASEBALL;
        }

        if($key === 'サッカー'){
            return self::FOOTBALL;
        }

        if($key === 'バスケットボール'){
            return self::BASKETBALL ;
        }

        if($key === 'ゴルフ'){
            return self::GOLF;
        }

        return parent::getValue($key);
    }
}
```

## ビューで使用する場合
コントローラからスポーツ種別が```2```で返ってきた場合

```php
<p>{{ App\Enums\SportType::getDescription($item['sport_type']) }}</p> // バスケットボール
```

### ラジオボタン
``toSelectArray()``で``value=>description``の形で取得することができます。
※最新のバージョンだと``asSelectarray()``
``[0 => BASEBALL, 1 => FOOTBALL, 2 => BASKETBALL, 3 => GOLF]``

```php
@foreach(App\Enums\SportType::toSelectArray() as $key => $val)
    <div class="form-check form-check-inline">
    {{ Form::radio('sport_type', $key, ($key === $item['sport_type']), ['class' => 'form-check-input']) }}
    {{ Form::label('sport_type'.$key, $val, ['class' => 'radio_class']) }}
    </div>
@endforeach
```
セレクトボックスなども同様に``App\Enums\SportType::toSelectArray()``でリストを取得してforeachで回せば簡単に実装することができます。

## コントローラで使用する場合
```php
use App\Enums\SportType;
```

```php
SportType::getDescription('0'); // 野球
SportType::getValue('野球'); // 0
```
## バリデーション
```php
$rules = [
    'sport_type' => 'required|enum_value:' . SportType::class . ',false',
]
```
``enum_value:' . SportType::class . ',false'``でvalueにない値がsport_typeに入って送られてきた場合に弾くことができます。
ちなみにfalseの意味ですが、Laravelでリクエストされたものは数値でも全てString型として送られてくるので、型チェックを回避するために``false``を指定してます。
>By default, type checking is set to strict, but you can bypass this by passing false to the optional second parameter of the EnumValue class.

上記と同じ意味ですが、下記のような書き方でも同じ動作になります。

```php
$rules = [
    'sport_type' => ['required', new EnumValue(UserType::class, false)],
]
```
``enum_value``と同様に``enum_key``でもキーのバリデーションをかけることができます。
詳しくは[README](https://github.com/BenSampo/laravel-enum/blob/272377a29c85f20d66b4bcd2605474e7474a0d51/README.md#array-validation)を見るとわかりやすいと思います。


## 参考
https://github.com/BenSampo/laravel-enum/blob/272377a29c85f20d66b4bcd2605474e7474a0d51/README.md#array-validation

https://zenn.dev/naoki_oshiumi/articles/4741c1c8ee1d44

https://qiita.com/sayama0402/items/4e8a885fed367090de12