LaravelにてEnumを導入する
"laravel-enum"を利用してLaravelの開発にEnum(列挙型)を導入します。状態(Status)のon/offや性別(Sex)などの定数値に適応していきます
[ 目次 ]
はじめに
こんばんは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。
PHPでは、SplEnumを利用するかTraitを使った独自実装でEnumを実現してきました。
今回は"Laravel"案件にEnumを導入していきますが、BenSampo/laravel-enumを利用して実現していきます。
※ makeコマンドを利用してEnumクラスをジェネレートしたかったので、myclabs/php-enum ではなく"laravel-enum"にしました。
■ 環境
ライブラリ | バージョン |
---|---|
PHP | ^7.1.3 |
Laravel | 5.6.* |
laravel-enum | ^1.10 |
"laravel-enum"のインストール
$ composer require bensampo/laravel-enum
導入
今回はユーザーの性別データをEnumにしていきます。
プロフィール(App\Models\User\Profile
モデル)に性別データを保持するようにしているので、Profileモデルに Enums\User\Profile\Sex
というEnumを組み込みます。
$ php artisan make:enum User/Profile/Sex
App\Enums\User\Profile\Sex.php
<?php
declare(strict_types=1);
namespace App\Enums\User\Profile;
use BenSampo\Enum\Enum;
final class Sex extends Enum
{
/** 0:未設定 */
const None = 0;
/** 1:男性 */
const Male = 1;
/** 2:女性 */
const Female = 2;
/** 9:未回答 */
const Unanswered = 9;
public static function getDescription($value): string
{
foreach(Sex::getValues() as $v) {
if ($value === $v) {
return __('enum.user_profile.sex.' . strtolower(Sex::getKey($v)));
}
}
return self::getKey($value);
}
}
resources/lang/ja/enum.php
多言語ファイルを用意し、Enumの値の説明を多言語化します。
今回はjaファイルを例にします
<?php
return [
'user_profile' => [
'sex' => [
'none' => '未設定',
'male' => '男性',
'female' => '女性',
'unanswered' => '未回答',
]
],
];
App\Models\User\Profile.php
Profileモデルに性別の説明を取得するfunctionを追加します。
public function getSexDescription()
{
return \App\Enums\User\Profile\Sex::getDescription($this->sex);
}
利用方法
モデルからgetSexDescriptionを呼び出すことで性別のデータが取得できます。
$ php artisan tinker
>>> $user = \App\Models\User::find(1);
=> App\Models\User {#2958
id: 1,
email: "sample@gmail.com",
verified: 0,
email_token: "97zkkkBR5sou9dBA6KppvOacAkG53sHAZLBMi17dBuc=",
last_login_at: null,
created_ip: "172.19.0.1",
updated_ip: "172.19.0.1",
created_at: 1535181329,
updated_at: 1535181329,
}
>>> $user->profile->getSexDescription()
=> "未設定"
最後に
Javaを利用していた時は当たり前のように利用していたEnumですが、PHPでは利用していない案件も多々あります。
Enumの導入を試してみてはいかがでしょうか?
数値のまま管理すると「どの値が何を意味しているのか」調べるのに時間がかかることあります。Enumを導入するとどの値が何を意味しているのかすぐにわかりますよ。