はじめに

BenSampo/laravel-enum を利用して、Laravel で Enum を使う方法を整理した。

※機能が豊富なので、自分が使った範囲のみ。

TL;DR

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. セットアップ
    2. Enum 作成
    3. Localization
    4. 値→説明文
      1. モデルのキャスト
    5. セレクトボックスのオプション
    6. バリデーション
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88

$ php -v
PHP 7.3.9 (cli) (built: Sep 10 2019 17:45:01) ( NTS )

$ composer -V
Composer version 1.9.0 2019-08-02 20:55:32

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

詳細

セットアップ

composer でインストール

1
$ composer require bensampo/laravel-enum

config/app.php に追加

1
2
3
4
5
 'providers' => [
...
+ BenSampo\Enum\EnumServiceProvider::class,
...
],

Enum 作成

php artisan make:enum で Enum を作成できる。

1
$ php artisan make:enum UserType

app/Enums/UserType.php が生成されるので、適当に使いたい値を編集。

1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App\Enums;

use BenSampo\Enum\Enum;

final class UserType extends Enum
{
const Administrator = 0;
const GeneralUser = 1;
}

これで UserType::Administrator0UserType::GeneralUser1 という感じで扱えるようになる。

Localization

ローカライゼーション(日本語で表示)したい場合は implements LocalizedEnum を追加

1
2
3
4
5
6
7
8
9
10
11
12
 <?php

namespace App\Enums;

use BenSampo\Enum\Enum;

-final class UserType extends Enum
+final class UserType extends Enum implements LocalizedEnum
{
const Administrator = 0;
const GeneralUser = 1;
}

config/app.phplocaleja に変更。

1
'locale' => 'ja',

翻訳ファイルとして resources/lang/ja/enums.php を作成し、対応する内容を設定。

1
2
3
4
5
6
7
8
9
10
<?php

use App\Enums\UserType;

return [
UserType::class => [
UserType::Administrator => '管理者',
UserType::GeneralUser => '一般ユーザー',
],
];

値→説明文

getDescription() で説明文が取得できるが、Localization していると locale に合った内容が出力される。

1
2
3
4
5
6
7
// locale = 'en' の場合
UserType::getDescription(0);
// => 'Administrator'

// locale = 'ja' の場合
UserType::getDescription(0);
// => '管理者'

blade.php 内で表示するときも、以下のように getDescription() を使う。

1
{{ App\Enums\UserType::getDescription($request->user_type) }}

モデルのキャスト

モデル内で CastsEnums を使うことで、自動でキャストしてくれるようになる(っぽい)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+use BenSampo\Enum\Traits\CastsEnums;
+use BenSampo\Enum\Tests\Enums\UserType;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
+ use CastsEnums;
+
+ protected $enumCasts = [
+ 'user_type' => UserType::class,
+ ];
+
+ protected $casts = [
+ 'user_type' => 'int',
+ ];
...
}

キャストされている場合、key, value, description が利用可能。
参考: Instance Properties

1
2
3
4
5
6
7
8
$user->user_type->key;
// => 'Administrator'

$user->user_type->value;
// => 0

$user->user_type->description;
// => '管理者'

セレクトボックスのオプション

<select> に使いたいときは toSelectArray() を使う。

1
2
3
4
5
{{ Form::select(
'user_type',
App\Enums\UserType::toSelectArray()
)
}}

これで以下の HTML になる。ここも Localization していると、locale に合った内容になる。

1
2
3
4
<select>
<option value="0">管理者</option>
<option value="1">一般ユーザー</option>
</select>

バリデーション

バリデーションenum_value などが使える。

HTML フォームだと数値も文字列扱いになるので、要件に応じて ',false' を付けて restrict = false としておく。

1
2
3
4
'user_type' => [
'required',
'enum_value:' . UserType::class . ',false',
],

まとめ

その他・メモ

他にも機能が色々とあるので、気が向いたら追記なり別記事作成なりするかも。

参考文献

関連記事