はじめに
自分が理解できていない部分を整理しながら、知識を少しずつ深めていくことを目的にこの記事を書いています。
そのため、内容の中には誤りが含まれている可能性もありますが、その点はご容赦ください。
間違いなどがあれば、ぜひコメントなどで教えていただけると嬉しいです!🙇
今日整理していく内容
- メソッド名⇔プロパティ名の変換・自動実行
- Attribute とは何か
- CarbonImmutable/Carbon について
メソッド名⇔プロパティ名の変換・自動実行
これは、かなり驚いたのですが、Laravel側が自動でいい感じに読み取って変換してくれる?? ← そんなことあるの?って思ったけど、実際にコードは動いていました(笑)
公式を引用します。
An accessor transforms an Eloquent attribute value when it is accessed. To define an accessor, create a protected method on your model to represent the accessible attribute. This method name should correspond to the "camel case" representation of the true underlying model attribute / database column when applicable.
https://laravel.com/docs/12.x/eloquent-mutators?utm_source=chatgpt.com
テーブル/モデルに「home_post」というカラム(属性名・プロパティ名)を持っていることを前提として、以下のようなコードになります。
use Illuminate\Database\Eloquent\Casts\Attribute;
protected function homePost(): Attribute
{
return Attribute::make(
get: fn($value) => strtoupper($value)
);
}
この場合、モデルで $model->home_post を呼ぶと、homePost() メソッドがアクセサとして動作します。
え!!すごくない??って思いました!勝手に変換されるんですね。感動しました。
Attribute とは何か
これも最初は全くわかりませんでした。「何してるの??」って頭の中がずっとモヤモヤしていたので、ここで改めて整理していきます。
簡単にまとめると、データベースから取得したデータに、実行時に追加の処理を施したり、形式を変換したりするための「属性」みたいですね。
言葉だけだといまいちピンとこないので、実例を見てみます。
protected function firstName(): Attribute
{
return Attribute::make(
get: fn (string $value) => ucfirst($value),
);
}
-
: Attribute→ 「この関数は Attribute 型の値を返すよ」という戻り値の型宣言。 -
return Attribute::make(...)→ 実際にその Attribute オブジェクトを返している。
つまり、Attribute は「値をどう扱うか」を定義したオブジェクトということですね。
なんとなく脳死で使ってしまいそうですが(笑)、周辺のコードを参考にしながら少しずつ理解していきます!
CarbonImmutable/Carbon について
これは、今の案件に入ってから初めて聞いた単語ですね。初めて聞いたなんて言うと少し怒られそうですが、もしかしたら過去にも聞いたことがあったかもしれません。とりあえず「初めて」ということにしておきます(笑)
Carbonは、PHP の DateTime クラスを拡張した日付・時刻操作のためのライブラリです。
レビューでよく「Carbonの使い方」について指摘を受けていたのですが、どうやら通常の Carbon インスタンスは変更可能(ミュータブル)なので、思わぬ副作用が起きることがあるようです...。
一方で、CarbonImmutable(不変版)は、元のインスタンスを変更せずに新しいインスタンスを返してくれるので、安全に使えるとのこと。
日付や時刻を扱うビジネスロジックでは、できるだけ CarbonImmutable を使っていきたいと思います!
まとめ
ここまで読んでいただきありがとうございました!
今回の記事では、
- メソッド名⇔プロパティ名の変換・自動実行
- Attribute とは何か
- CarbonImmutable/Carbon について
について整理しました。
余談ですが、最近はウィスキーにハマってしまって・・・夜は飲みながら勉強しています笑
明日も頑張ります!💪