Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
13
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@10mi8o

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ディレクトリが作成され、以下ファイルが作成されます。
スクリーンショット 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

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
13
Help us understand the problem. What are the problem?