Laravel で Enum (with BenSampo/laravel-enum)
はじめに
BenSampo/laravel-enum を利用して、Laravel で Enum を使う方法を整理した。
※機能が豊富なので、自分が使った範囲のみ。
TL;DR
- ローカライゼーションやバリデーションが簡単に実現できる
<select>
のオプションもtoSelectArray()
で簡単に設定できる- 他にも機能がいっぱいある
目次
環境・条件
1 | $ sw_vers |
詳細
セットアップ
composer
でインストール
1 | $ composer require bensampo/laravel-enum |
config/app.php
に追加
1 | 'providers' => [ |
Enum 作成
php artisan make:enum
で Enum を作成できる。
1 | $ php artisan make:enum UserType |
app/Enums/UserType.php
が生成されるので、適当に使いたい値を編集。
1 |
|
これで UserType::Administrator
が 0
、UserType::GeneralUser
が 1
という感じで扱えるようになる。
Localization
ローカライゼーション(日本語で表示)したい場合は implements LocalizedEnum
を追加
1 | <?php |
config/app.php
の locale
を ja
に変更。
1 | 'locale' => 'ja', |
翻訳ファイルとして resources/lang/ja/enums.php
を作成し、対応する内容を設定。
1 |
|
値→説明文
getDescription()
で説明文が取得できるが、Localization していると locale
に合った内容が出力される。
1 | // locale = 'en' の場合 |
blade.php
内で表示するときも、以下のように getDescription()
を使う。
1 | {{ App\Enums\UserType::getDescription($request->user_type) }} |
モデルのキャスト
モデル内で CastsEnums
を使うことで、自動でキャストしてくれるようになる(っぽい)
1 | +use BenSampo\Enum\Traits\CastsEnums; |
キャストされている場合、key
, value
, description
が利用可能。
参考: Instance Properties
1 | $user->user_type->key; |
セレクトボックスのオプション
<select>
に使いたいときは toSelectArray()
を使う。
1 | {{ Form::select( |
これで以下の HTML になる。ここも Localization していると、locale
に合った内容になる。
1 | <select> |
バリデーション
バリデーションは enum_value
などが使える。
HTML フォームだと数値も文字列扱いになるので、要件に応じて ',false'
を付けて restrict = false
としておく。
1 | 'user_type' => [ |
まとめ
- ローカライゼーションやバリデーションが簡単に実現できる
<select>
のオプションもtoSelectArray()
で簡単に設定できる- 他にも機能がいっぱいある
その他・メモ
他にも機能が色々とあるので、気が向いたら追記なり別記事作成なりするかも。
参考文献
- BenSampo/laravel-enum: Simple, extensible and powerful enumeration implementation for Laravel.
- Laravel-enumの使い方 - Qiita
- laravel-enumを使ってみたら快適だった | RE:ENGINES
- LaravelにてEnumを導入する
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で生 SQL を実行
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア