👻
laravel-lift はじめ
laravel-lift とは
PHP8 から使用可能になった属性(Attribute) を、Model のプロパティに付与し、fillable
やcast
などの情報を与えることで、Model クラスが読みやすくなるライブラリ。
機能としては、Eloquent で提供されるものと変わらない。(足りないものはあるかもですが)
デフォルトの 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