mcpField
L
laravel-enums

laravel-enums

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

laravel-enums について

Laravel 開発向けに、有限で型安全な値を enum で表す方法を解説します。バックド enum、振る舞い、UI 用ヘルパー、モデル・DTO・バリデーション・キューでの利用を扱い、ステートマシンとの使い分けも示します。

主な機能

  1. 01文字列または整数の backed enum
  2. 02enum への振る舞いと Trait の追加
  3. 03ラベルとドロップダウンデータの提供
  4. 04モデルと DTO での enum 利用
  5. 05enum 値のバリデーション
  6. 06enum とステートマシンの選択

活用シーン

  1. 01注文ステータスと支払い方法のモデル化
  2. 02リクエスト内の enum フィールド検証
  3. 03enum 値によるキュー名の指定

インストール

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

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

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

詳細

Laravel の列挙型

列挙型を使用すると、型安全な有限の値セットを定義できます。

関連ガイド:

常にバックド列挙型を使用する

常にバックド列挙型(文字列または整数)を使用します。

<?php

declare(strict_types=1);

namespace App\Enums;

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

トレイトを使用した列挙型

トレイトを使って機能を追加します。

<?php

declare(strict_types=1);

namespace App\Enums;

use Henzeb\Enumhancer\Concerns\Comparison;
use Henzeb\Enumhancer\Concerns\Dropdown;

enum OrderStatus: string
{
    use Comparison, Dropdown;

    case Pending = 'pending';
    case Processing = 'processing';
    case Completed = 'completed';
    case Cancelled = 'cancelled';
}

ラベルを持つ列挙型

<?php

declare(strict_types=1);

namespace App\Enums;

use App\Enums\Attributes\Label;
use App\Enums\Concerns\HasLabel;

enum PaymentMethod: string
{
    use HasLabel;

    #[Label('Credit Card')]
    case CreditCard = 'credit-card';

    #[Label('Bank Transfer')]
    case BankTransfer = 'bank-transfer';

    #[Label('PayPal')]
    case PayPal = 'paypal';
}

カスタム列挙型属性

<?php

declare(strict_types=1);

namespace App\Enums\Attributes;

use Attribute;

#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
class Label
{
    public function __construct(public string $value) {}
}

#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
class Color
{
    public function __construct(public string $value) {}
}

#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
class Icon
{
    public function __construct(public string $value) {}
}

列挙型の関心事

<?php

declare(strict_types=1);

namespace App\Enums\Concerns;

use App\Enums\Attributes\Label;
use Henzeb\Enumhancer\Concerns\Attributes;
use Henzeb\Enumhancer\Concerns\Dropdown;
use Henzeb\Enumhancer\Concerns\Labels;

trait HasLabel
{
    use Attributes, Dropdown, Labels;

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

    public function getLabel(): ?string
    {
        return $this->getAttribute(Label::class)?->value;
    }
}

列挙型のビジネスロジック

列挙型には振る舞いを含めることができます。

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),
],

一般的なパターン

比較
if ($order->status->is(OrderStatus::Completed)) {
    // ...
}

// With enumhancer Comparison trait
if ($order->status->isCompleted()) {
    // ...
}
UI属性
$status->getLabel();  // 'Completed'
PaymentMethod::dropdown();  // For select inputs
OrderStatus::labels();  // All labels as array
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',
};

キューの列挙型の例

<?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
├── Attributes/
│   ├── Label.php
│   ├── Color.php
│   └── Icon.php
└── Concerns/
    └── HasLabel.php

列挙型とステートマシンの使い分け

列挙型を使用する場合:

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

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

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

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

まとめ

列挙型を使用すると、次のことが可能になります:

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

常に文字列または整数の値を持つバックド列挙型を使用してください。

コメント