mcpField
L
laravel-enums

laravel-enums

github.com/leeovery開発1550 回インストール2 週間前に更新
リポジトリ

laravel-enums について

laravel-enumsは、型安全な有限値を扱うLaravel開発者向けのスキルです。バックド列挙型や再利用可能な振る舞いを説明し、モデル、DTO、バリデーション、キューでの利用方法を示します。

主な機能

  1. 01バックド列挙型のパターン
  2. 02列挙型のメソッドとトレイト
  3. 03モデルのキャスト
  4. 04DTOプロパティ
  5. 05列挙型のバリデーション
  6. 06キュー値の利用

活用シーン

  1. 01注文ステータスの表現
  2. 02列挙型間でのラベル共有
  3. 03列挙型入力の検証
  4. 04ジョブの名前付きキューへの割り当て

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/leeovery/agentic-skills --skill laravel-enums

インストール後、Claude Code で/laravel-enumsを入力して読み込まれたか確認します。

詳細

Laravel Enums

Enum は、型安全な有限個の値の集合を提供します。

関連ガイド:

常に Backed Enum を使用する

常に Backed Enum(文字列または整数)を使用します:

<?php

declare(strict_types=1);

namespace App\Enums;

enum OrderStatus: string
{
    case Pending = 'pending';
    case Processing = 'processing';
    case Completed = 'completed';
    case Cancelled = 'cancelled';
}

Enum の拡張

必要に応じて、Enum にメソッドやトレイトを追加して機能を拡張します。共通の振る舞いは app/Enums/Concerns/ のトレイトにまとめます。

// Direct methods for one-off behavior
enum OrderStatus: string
{
    case Pending = 'pending';
    case Completed = 'completed';

    public function label(): string
    {
        return match ($this) {
            self::Pending => 'Pending Review',
            self::Completed => 'Completed',
        };
    }

    public function color(): string
    {
        return match ($this) {
            self::Pending => 'yellow',
            self::Completed => 'green',
        };
    }
}
// Reusable trait for shared behavior across enums
trait HasLabel
{
    abstract public function label(): string;

    public static function labels(): array
    {
        return collect(self::cases())->mapWithKeys(
            fn ($enum) => [$enum->value => $enum->label()]
        )->toArray();
    }
}

Enum にビジネスロジックを記述する

Enum には、match 式を使って振る舞いを定義できます:

enum PaymentProvider: string
{
    case Stripe = 'stripe';
    case PayPal = 'paypal';
    case Square = 'square';

    public function processingFee(int $amount): int
    {
        return match ($this) {
            self::Stripe => (int) ($amount * 0.029 + 30),
            self::PayPal => (int) ($amount * 0.034 + 30),
            self::Square => (int) ($amount * 0.026 + 10),
        };
    }

    public function supportsRefunds(): bool
    {
        return match ($this) {
            self::Stripe, self::PayPal => true,
            self::Square => false,
        };
    }
}

モデルでの使用

protected function casts(): array
{
    return [
        'status' => OrderStatus::class,
        'payment_method' => PaymentMethod::class,
    ];
}

DTO での使用

public function __construct(
    public OrderStatus $status,
    public PaymentMethod $paymentMethod,
) {}

バリデーションでの使用

use Illuminate\Validation\Rules\Enum;

'status' => [
    'required',
    'string',
    'bail',
    new Enum(OrderStatus::class),
],

よくあるパターン

Match 式
$message = match ($order->status) {
    OrderStatus::Pending => 'Your order is pending',
    OrderStatus::Processing => 'We are processing your order',
    OrderStatus::Completed => 'Your order is complete',
    OrderStatus::Cancelled => 'Your order was cancelled',
};

キュー Enum の例

<?php

declare(strict_types=1);

namespace App\Enums;

enum Queue: string
{
    case Default = 'default';
    case Processing = 'processing';
    case Emails = 'emails';
    case Notifications = 'notifications';
}

ジョブでの使用:

public function __construct(public Order $order)
{
    $this->onQueue(Queue::Emails->value);
}

ディレクトリ構成

app/Enums/
├── OrderStatus.php
├── PaymentMethod.php
└── Queue.php

Enum とステートマシンの使い分け

Enum を使用する場合:

  • 単純なステータスフィールド
  • 遷移ロジックがない
  • 副作用がない

ステートマシンを使用する場合:

  • ルールを伴う複雑な状態遷移
  • 状態固有の振る舞い
  • 遷移時の副作用

ステートマシンについては、ステートマシンを参照してください。

まとめ

Enum が提供するもの:

  • 型安全性
  • 有限個の値の集合
  • ビジネスロジックのカプセル化
  • UI ヘルパー(ラベル、色、アイコン)
  • IDE のオートコンプリート

常に文字列または整数の値を持つ Backed Enum を使用します。

コメント