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だけで完結できればいいんですが思いつかなかったのでもし知っている方いたらコメントもらえると嬉しいです!