15
14

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 5 years have passed since last update.

Laravel-enumを使ってみた

Last updated at Posted at 2019-08-25

最近、実務で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

15
14
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
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?