はじめに
PHPでEnumが使えるようになって久しいですが、LaravelはEnumをどこまでサポートしているのか気になったので調べてみました。
※調べたLaravelのバージョンは11です
※この記事ではEnumについては解説していません
Routing
ルート定義のルートセグメントの値にEnumの値が含まれていた場合のみルートを呼び出すことができます。
use App\Enums\Fruits;
use Illuminate\Support\Facades\Route;
Route::get('/fruits/{fruits}', function (Fruits $fruits) {
return $fruits->value;
});
ルートセグメント「{fruits}」が、Enumの値に含まれていないものだった場合は404のHTTPレスポンスを返します。
Validation
ValidationのルールのEnumは対象フィールドの値にEnumの値が含まれるかを検証します。
use App\Enums\Fruits;
use Illuminate\Validation\Rule;
$request->validate([
'fruits' => [Rule::enum(Fruits::class)],
]);
メソッド「only」または「except」でケースを制限することができます。
Rule::enum(Fruits::class)
->only([Fruits::Apple, Fruits::Banana]);
Rule::enum(Fruits::class)
->except([Fruits::Lemon, Fruits::Orange]);
メソッド「when」で条件によってケースを切り替えることができます。
Rule::enum(Fruits::class)
->when(
now()->isSunday(),
fn ($rule) => $rule->only([Fruits::Apple, Fruits::Banana]),
fn ($rule) => $rule->only([Fruits::Lemon, Fruits::Orange]),
);
Request
Requestから取得する値をEnumとして取得することができます。
use App\Enums\Fruits;
$fruits = $request->enum('fruits', Fruits::class);
Enumの値ではなかった場合は「null」が返ります。
Cast
モデルのメソッド「casts」で属性とEnumを指定することで、任意の属性をキャストできるようになります。
use App\Enums\Fruits;
/**
* キャストする属性の取得
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'fruits' => Fruits::class,
];
}
さいごに
LaravelでEnumをサポートしている箇所が思っていたよりもあったので、今後使う機会があれば使っていこうと思いました。