LaravelでEnumを使いたい場合は標準で用意はされていないために機能を持ったパッケージを入れる必要があります。
この記事では「bensampo/laravel-enum」を導入する方法と使い方を解説!
Contents
「bensampo/laravel-enum」をインストール
Composerで導入
下記コマンドでComposerから入れましょう。
1 | $ composer require bensampo/laravel-enum |
config/app.phpに追加
Laravelのバージョンが5.5未満の場合には「config/app.php」の編集が必要です。
「providers」へ「BenSampo\Enum\EnumServiceProvider」を追加します。
導入はこれだけで完了です。
使い方
今回は例としてMessageモデルのステータスを作ってみます。
コマンドでクラスの生成
下記コマンドを実行します。
1 | php artisan make:enum MessageStatus |
「app/Enums/MessageStatus.php」が生成されます。
Enumクラスを編集
生成されたクラスには例として「OptionOne」などが記述してあるので、実際に使うものを定義しましょう。
今回は未読、既読で2種類用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php namespace App\Enums; use BenSampo\Enum\Enum; final class MessageStatus extends Enum { const Unread = 0; const Read = 1; } |
定義された一覧を取得する
1 2 3 4 5 | <?php use App\Enums\MessageStatus; $keys = MessageStatus::getKeys(); // キーの一覧を取得 $values = MessageStatus::getValues(); // 値の一覧を取得 |
一覧を配列で取得することができます。
キーと値をそれぞれ取得
1 2 3 4 5 | <?php use App\Enums\MessageStatus; $key = MessageStatus::getKey(1); // キーを取得 $value = MessageStatus::getValues('Read'); // 値を取得 |
それぞれ変換できます。
モデルで使う
自動で変換するように
DBには整数(今回は0, 1)でして欲しいが何を表しているのかわかりにくいため、自動で変換するようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use App\Enums\MessageStatus; class Message extends Model { /** * Get status attribute * @return string */ public function getStatusAttribute() { return MessageStatus::getKey($this->attributes['status']); } /** * Set status attribute * @param string */ public function setStatusAttribute($status) { $this->attributes['status'] = MessageStatus::getValue($status); } } |
これによりAPIの場合そのままreturnしてもstatusには「Unread」などが入ります。また、viewでもそのまま出力できます。
また保存する時にも、下記の様にそのままセットしてもDBにはintに変えて保存してくれます。
1 | $message->update(['status' => 'Unread' ]); |
特にフロントサイドからPOSTされた場合などもそのまま扱えるので便利です。
バリデーション
定義した値以外を弾きたい場合は多いと思います。
下記のようにルールを定義することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; use BenSampo\Enum\Rules\EnumKey; use App\Enums\MessageStatus; abstract class Message extends FormRequest { /** * Determine if the contact is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'status' => ['filled', 'string', new EnumKey(MessageStatus::class)] ]; } } |
まとめ
「bensampo/laravel-enum」を導入することでLaravelでEnumを使うことができました。導入も簡単で非常に便利なのでぜひ開発時に利用してみてください。