👻

laravel-lift はじめ

2023/09/02に公開

laravel-lift とは

PHP8 から使用可能になった属性(Attribute) を、Model のプロパティに付与し、fillablecastなどの情報を与えることで、Model クラスが読みやすくなるライブラリ。
機能としては、Eloquent で提供されるものと変わらない。(足りないものはあるかもですが)

https://wendell-adriel.gitbook.io/laravel-lift/

デフォルトの User Model を laravel-lift に変えてみる

多分↓みたいな感じ
お好みでスネークケースのプロパティをキャメルケースに変えてます
各アトリビュートについては、ドキュメントに記載があるのでこちらでは解説しません

use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Column;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Hidden;
use WendellAdriel\Lift\Attributes\PrimaryKey;
use WendellAdriel\Lift\Lift;

class User extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use Notifiable;
    use Lift;

    #[PrimaryKey]
    public int $id;

    #[Fillable]
    public string $name;

    #[Fillable]
    public string $email;

    #[Cast('bool')]
    public bool $rememberToken;

    #[Column(name: 'email_verified_at', default: null)]
    #[Fillable]
    #[Cast('immutable_datetime')]
    public ?CarbonImmutable $emailVerifiedAt;

    #[Fillable]
    #[Hidden]
    #[Cast('hashed')]
    public string $password;

    #[Column(name: 'created_at')]
    #[Cast('datetime')]
    public Carbon $createdAt;

    #[Column(name: 'updated_at')]
    #[Cast('datetime')]
    public Carbon $updatedAt;
}

見やすくなった?

これは正直意見が分かれそう。
ただ、デフォルトの状態だと、「そもそも何のプロパティ持ってるんだっけ?」的なことが起こると思うので、個人的には lift 使った方が見やすいと思う。

入力補完について

PHPの場合、Model のプロパティに入力補完を聞かせるためには ide-helperとかを入れないといけなかったが、クラスに意味がある形でプロパティを定義できるようになったので、それは必要なくなる。
もちろんリレーションの定義とか補完効かないので、完全に脱却することはできないが、保守するべきものがコメントではなくコードに変わっていくのは嬉しみ。(たまに変更忘れちゃうので)

Cast について

ドキュメントではあまりパターンが紹介されていなかったが、enum の値や hashed なども問題なく cast できていた。(↓みたいな感じ)

enum Meta: string {
  case Hoge = 'hoge';
  case Fuga = 'fuga'
}

#[Cast(Meta::class)]

感想

個人的には書き方が直感的で、TypeORMと結構似ている感じがして使いやすそうと思っている。
version もガンガン update されているので、今後が楽しみ。

Discussion