最近、実務でEnumを使う場面が多かったので、Laravelでenumを使いたい時のメモとしてまとめます。
そもそもEnumって何?って話ですが、これは「列挙型」と呼ばれており、複数の定数をひとまとめにする事が出来ます。
また、「未読・既読」や「公開・非公開」みたいなフラグをboolean型
で定義するケースが良くあると思います。実際に格納される値は0
か1
だが、文字列として公開
非公開
を扱いたい、といったケースに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ディレクトリが作成され、以下ファイルが作成されます。
<?php
namespace App\Enums;
use BenSampo\Enum\Enum;
final class PublishStatus extends Enum
{
const OptionOne = 0;
const OptionTwo = 1;
const OptionThree = 2;
}
ディレクトリ作成と同時に、enumsフォルダの中に、上記ファイルが生成されます。
このファイルを以下のように変更していきましょう。
<?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上で使用してみましょう。
//非公開
<div>
{{\App\Enums\PublishStatus::getValue('0')}}
</div>
//公開
<div>
{{\App\Enums\PublishStatus::getValue('1')}}
</div>
定数の値を取得する事も出来ます。
//0
<div>
{{\App\Enums\PublishStatus::getValue('非公開')}}
</div>
//1
<div>
{{\App\Enums\PublishStatus::getValue('公開')}}
</div>
##キーバリューのリストを返す
キーバリューペアのリストを返す事ができるtoSelectArray
というメソッドも用意されています。こちらもselectタグ等で使う場面が結構あるかと思います。Controllerで用意してViewで表示してみます。
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文でプルダウンフォームを作成
@foreach($states as $key => $value)
<select name="" id="">
<option value="{{$key}}">{{$value}}</option>
</select>
@endforeach
以上、簡単ですが、復習も兼ねてメモとしてまとめました。
バリデーションルールなども定義できるようなので、ドキュメントをもう少し読んでみようと思います。
https://github.com/BenSampo/laravel-enum#validation