3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel6でlaravel-enumを使ってみる

Last updated at Posted at 2021-08-10

今回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

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で返ってきた場合

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

ラジオボタン

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

@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で回せば簡単に実装することができます。

コントローラで使用する場合

use App\Enums\SportType;
SportType::getDescription('0'); // 野球
SportType::getValue('野球'); // 0

バリデーション

$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.

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

$rules = [
    'sport_type' => ['required', new EnumValue(UserType::class, false)],
]

enum_valueと同様にenum_keyでもキーのバリデーションをかけることができます。
詳しくはREADMEを見るとわかりやすいと思います。

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?