Help us understand the problem. What is going on with this article?

Laravel-enumを使ってみた

More than 1 year has passed since last update.

最近、実務で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ディレクトリが作成され、以下ファイルが作成されます。
スクリーンショット 2019-08-25 16.08.42.png

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

10mi8o
もふもふした動物と音楽が好き。いつかは「完全に理解した」と言いたい。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした