世界を旅して暮らしたい放浪エンジニアブログ

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を導入するとどの値が何を意味しているのかすぐにわかりますよ。

参考記事

前のページ

次のページ

Profile

なかむ🇭🇰Webデベロッパー

なかむ🇭🇰Webデベロッパー

香港在住4年目になるWEBエンジニアのなかむです。 現在は、LaravelやRailsを利用したWEB開発を中心にエンジニアをしています。 顧客は全て日本の企業になります。リモート開発にて各企業様の支援を行なっております

プロフィール詳細はこちら

Latest Posts