1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LaravelAdvent Calendar 2024

Day 6

【Laravel】定数をModelで管理する時代は終わった

Last updated at Posted at 2024-12-05

Laravel Advent Calendar 2024 の6日目です :muscle:

こんにちは :smiley: tatata-keshiです :exclamation:

Webアプリケーションを開発において、ユーザーの種別やステータスといった定数をどのように管理するかは、みなさん一度は考えたことがあるのではないでしょうか?

Modelで定数を管理する方法

例えば、ユーザーの種別(一般会員、プレミアム会員など)を整数型で保存する際、これまでは次のようにModelファイルに定義するのが一般的でした。

User.php
class User extends Model
{
    const TYPE_GENERAL = 1;
    const TYPE_PREMIUM = 2;

    public static function getTypeLabels(): array
    {
        return [
            self::TYPE_GENERAL => '一般会員',
            self::TYPE_PREMIUM => 'プレミアム会員',
        ];
    }
}

Model用いることの問題点

しかしながら、Modelファイルに定数を記述する従来の方式には問題点がありました。

1. コードの可読性が低下

定数が増えると、モデルファイルが肥大化し、可読性が損なわれます。

2. 型安全性が保証されない

定数はあくまで整数値であり、意図しない値が代入されるリスクがあります。

3. メンテナンス性の低下

定数やその対応ラベルが複数の場所で使われると、変更時に影響範囲が広がります。

列挙型(Enum)の登場

PHP 8.1以降では、これらの課題を解決する列挙型(Enum)が導入されました。Enumを用いることで、コードの可読性や型安全性が大幅に向上します。以下は、先ほどの例をEnumで書き直したものです。

UserType.php
enum UserType: int
{
    case GENERAL = 1;
    case PREMIUM = 2;

    public function label(): string
    {
        return match($this) {
            self::GENERAL => '一般会員',
            self::PREMIUM => 'プレミアム会員',
        };
    }
}

列挙型をLaravelで活用する

Laravelのモデルと組み合わせることで、さらに便利に使えます。

データベースとの連携

$castsプロパティを活用することによってUserのtypeの型を自動で変換することができます。

User.php
class User extends Model
{
    protected $casts = [
        'type' => UserType::class,
    ];
}

これにより、データベースから取得した値は自動的に UserType 型として扱えます。

使用例

$user = User::find(1);

if ($user->type === UserType::PREMIUM) {
    echo "このユーザーはプレミアム会員です";
}

// ラベルを取得
echo $user->type->label(); // プレミアム会員

列挙型(Enum)を使うメリット

1. コードの可読性が向上

ラベルや値がEnum内にまとまっているため、管理がしやすくなります。

2. 型安全性の確保

Enum型を使うことで、意図しない値が代入されることを防ぎます。

3. メンテナンス性の向上

値やラベルの変更がEnum内で完結するため、影響範囲が最小限に抑えられます。

まとめ

このように、これまでModel内で管理していた定数をPHP 8.1以降の列挙型で置き換えることによりさらに効率よく、そして安全な実装ができるようになります。
もしまだPHP 8.1以降に移行していない場合は、この機会に移行を検討してみてはいかがでしょうか?

ぜひ、新しいEnumの力を活用し、新時代のLaravel開発に挑戦してください!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?