🦆

Laravel(+Livewire)でEnumを使う

2022/07/19に公開

Laravel8.7あたりから導入されたEnum機能を使った実装の備忘録

追加・編集するファイルは以下。

  • マイグレーションファイル
  • Enum定義ファイル(新規で作成)
  • モデルファイル
  • Livewire コンポーネントファイル
  • bladeファイル

マイグレーションファイル

# (前略)
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('slug', 100);
            $table->string('title', 255)->nullable();
            $table->text('body')->nullable();
	    // enum型ではなく、tinyintでカラムを作成。
            $table->tinyInteger('status')->unsigned()->nullable()->default(1);

            $table->timestamps();

            $table->unique('slug');
        });
    }
# (後略)

Enum定義ファイル

<?php

namespace App\Enums;

enum PostStatus: int
{
    case Draft = 1;
    case Active = 2;
    case Archived = 3;

       // 画面表示する際の文字列を定義
    public function getString(): string
    {
        return match($this)
        {
            self::Draft => 'draft',
            self::Active => 'active',
            self::Archived => 'archived',
        };
    }
}

モデルファイル


<?php

namespace App\Models;

use App\Enums\PostStatus;  // 作成したEnum定義ファイルの読み込み

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = [
        'slug',
        'title',
        'body',
        'status',
    ];

        // Enumキャストの記述を追加
    protected $casts = [
        'status' => PostStatus::class,
    ];

}

Livewire コンポーネントファイル

<?php

namespace App\Http\Livewire;

use App\Enums\PostStatus;  // Enum定義ファイルの読み込み
use App\Models\Post;

use Illuminate\Validation\Rules\Enum;  // ルールのEnumを追加読み込み

use Livewire\Component;

class Posts extends Component
{
    public Post $post;

    protected function rules() : array
    {
        return [
            'post.slug' => ['required', 'string', 'unique:posts'],
            'post.title' => ['required', 'string'],
            'post.body' => ['nullable', 'string'],
            'post.status' => ['required', new Enum(PostStatus::class)],    // バリデーションルールにEnumを使用
        ];
    }

    public function mount()
    {
        $this->post = new Post;
    }

    public function render()
    {
        return view('livewire.posts');
    }
}

bladeファイル

(省略)

文字を表示したい時は $post->status->getString()
値を保存する時は $post->status = PostStatus::Active
Enumをforeachなどで回したい時は $post->status->cases()

Discussion