15
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LaravelとEnum

Last updated at Posted at 2024-06-10

はじめに

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をサポートしている箇所が思っていたよりもあったので、今後使う機会があれば使っていこうと思いました。

15
7
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
15
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?