LoginSignup
8
8

More than 1 year has passed since last update.

LaravelのバリデーションRule::inのパラメータをEnumで表現する

Last updated at Posted at 2022-07-09

Laravelのバリデーションルール Rule::in の定義にEnumで指定できないかと思い試してみました。

検証バージョン

PHP8.1.6
Laravel9.16.0

定義方法

PHPのEnumは内部インターフェースとしてUnitEnumを持っており、cases()メソッドを用いてEnumの配列を取得することができます。
しかし、Rule::inの引数はstringもしくはintの配列のみ許容しているのでarray_columnでEnumから値を取得して指定してあげる必要があります。

Pure Enumの場合

Pure Enum
<?php

declare(strict_types=1);

namespace App\Enum;

enum Suit
{
    case Heart;
    case Diamonds;
    case Clubs;
    case Spades;
}

Pure Enumの値でバリデーションする場合
    public function rules()
    {
        return [
            'suit' => [
                'required',
                /**
                 * array_columnした時の値
                 * [
                 *   0 => "Heart"
                 *   1 => "Diamonds"
                 *   2 => "Clubs"
                 *   3 => "Spades"
                 * ]
                 */
                Rule::in(array_column(Suit::cases(), 'name'))
            ],
        ];
    }

Backed Enum(値を定義するEnum)の場合

Backed Enum
<?php

declare(strict_types=1);

namespace App\Enum;

enum Suit: int
{
    case Heart = 1;
    case Diamonds = 2;
    case Clubs = 3;
    case Spades = 4;
}

Backed Enumでバリデーションする場合
    public function rules()
    {
        return [
            'suit' => [
                'required',
                /**
                 * array_columnした時の値
                 * [
                 *   0 => 1
                 *   1 => 2
                 *   2 => 3
                 *   3 => 4
                 * ]
                 */
                Rule::in(array_column(Suit::cases(), 'value'))
            ],
        ];
    }

まとめ

今回はサンプルということでバリデーション定義でarray_columnを呼んでいますが、Enum側にvaluesメソッドを作って呼ぶのもありだと思います。
せっかくEnum定義しているのに値だけ取るというのもアレですが。。

本当はarray_columnとか呼ばずにEnumだけで完結できればいいんですが思いつかなかったのでもし知っている方いたらコメントもらえると嬉しいです!

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8