laravel-enums について
laravel-enumsは、型安全な有限値を扱うLaravel開発者向けのスキルです。バックド列挙型や再利用可能な振る舞いを説明し、モデル、DTO、バリデーション、キューでの利用方法を示します。
主な機能
- 01バックド列挙型のパターン
- 02列挙型のメソッドとトレイト
- 03モデルのキャスト
- 04DTOプロパティ
- 05列挙型のバリデーション
- 06キュー値の利用
活用シーン
- 01注文ステータスの表現
- 02列挙型間でのラベル共有
- 03列挙型入力の検証
- 04ジョブの名前付きキューへの割り当て
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ leeovery/ agentic-skills --skill laravel-enumsインストール後、Claude Code で/laravel-enumsを入力して読み込まれたか確認します。
詳細
Laravel Enums
Enum は、型安全な有限個の値の集合を提供します。
関連ガイド:
- ステートマシン - 複雑な状態遷移に使用します
- モデル - モデルでの Enum キャスト
- DTO - Enum プロパティを持つ DTO
- form-requests.md - 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 を使用します。
コメント
Markdown 対応