⛏️

LaravelにおけるEnumの活用方法

に公開

PHP 8.1で導入されたEnum(列挙型)は、Laravel開発においても非常に強力なツールです。型安全性の向上やビジネスロジックのカプセル化、IDEサポートの強化など、多くの利点があります。

PHPのEnumとは?

Enumは、関連する定数をグループ化し、型安全性を提供する機能です。従来の定数定義と比べて、
以下のような利点があります。

  • 型安全性: 無効な値の使用を防止
  • 自己文書化: コードの意図が明確
  • カプセル化: 関連するロジックを一箇所にまとめられる

詳細はPHP公式マニュアルをご参照ください。

LaravelでのEnumの活用方法

1. Enumの定義

Laravelでは、php artisan make:enumコマンドを使用してEnumを作成できます。

php artisan make:enum OrderStatus

生成されたEnumファイルに、必要なケースを定義します。

<?php

namespace App\Enums;

enum OrderStatus: int
{
    case PENDING = 1;
    case PROCESSING = 2;
    case SHIPPED = 3;
    case DELIVERED = 4;
    case CANCELLED = 5;
}

2. モデルでのEnumの使用

Laravel 9以降では、モデルの$castsプロパティを使用して、データベースの値をEnumに
キャストできます。

<?php

namespace App\Models;

use App\Enums\OrderStatus;
use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $casts = [
        'status' => OrderStatus::class,
    ];
}

これにより、以下のようにEnumを直接使用できます。

$order = Order::find(1);

if ($order->status === OrderStatus::DELIVERED) {
    echo '配達完了しています';
}

3. Enumにメソッドを追加

Enumにはメソッドを定義でき、関連するロジックをカプセル化できます。

<?php

namespace App\Enums;

enum OrderStatus: int
{
    case PENDING = 1;
    case PROCESSING = 2;
    case SHIPPED = 3;
    case DELIVERED = 4;
    case CANCELLED = 5;

    public function label(): string
    {
        return match($this) {
            self::PENDING => '処理待ち',
            self::PROCESSING => '処理中',
            self::SHIPPED => '発送済み',
            self::DELIVERED => '配達完了',
            self::CANCELLED => 'キャンセル',
        };
    }
}

4. バリデーションでのEnumの使用

LaravelのバリデーションルールでEnumを使用できます。

use App\Enums\OrderStatus;
use Illuminate\Validation\Rules\Enum;

$request->validate([
    'status' => ['required', new Enum(OrderStatus::class)],
]);

これにより、statusフィールドがOrderStatusの有効な値であることを検証できます。

5. ビューでのEnumの使用

Bladeテンプレート内でEnumのメソッドを使用できます。

<span class="badge">{{ $order->status->label() }}</span>

Enumのメリットとデメリット

メリット

  • 型安全性: 無効な値の使用を防止
  • 自己文書化: コードの意図が明確
  • カプセル化: 関連するロジックを一箇所にまとめられる
  • IDEサポート: コード補完や静的解析のサポートが充実
  • 拡張性: 新しいケースを追加しても既存のコードへの影響が最小限

デメリット

  • PHP 8.1以上が必要: 古いPHPバージョンでは使用できない

まとめ

LaravelにおけるEnumの活用は、コードの可読性、保守性、型安全性を向上させる強力な手段です。
特に、モデルとの連携やバリデーション、ビューでの使用において、Enumは非常に有用です。
PHP 8.1以降を使用している場合は、積極的にEnumを取り入れて、より堅牢で保守性の高いコードを
目指しましょう。

さらに詳細な情報や実践的な例については、以下のリソースをご参照ください。

Discussion