導入
新卒のエンジニアです。
簡単なプロフィールは以下に
- 私立文系卒
- 学生時代に1年半ほどインターン活動
- Laravelを頑張った
- めちゃめちゃ柏レイソルファン
- 弱くても応援を続けたチームが、強くなる瞬間こそ至高!
- ジョジョ、ガンダムがマイブーム
本記事では、Laravelにおけるアクセサ・ミューテタについて紹介していきます
おそらく初学者は知らないであろうLaravelの仕様です
ものすごく便利な上、初学者が通るであろう道にはなかなか置いていないと思っています
そのため、少し初学者を抜け出せるのではないでしょうか!
- Laravelを数ヶ月学習したけど、まだ自分は初学者を抜け出せていない
- モデルで取得したプロパティの扱いを上手くなりたい
こんな人に読んでもらえると嬉しいです!
アクセサ・ミューテタって
簡単に表現すると
- プロパティを取得または挿入するときの変換ロジックをモデル側で定義すること
です!
これが非常に便利です!
具体例ベースで進めていきます!
どんな場面で用いるか
よくあるケースかと思い、性別の扱いについて取り上げます
webアプリケーションでユーザが持つ属性について考えた際、名前や性別は高い確率で入ってくるでしょう
その際に、性別はどのように管理するでしょうか
だいたいの場合、テーブルのgenderカラムに以下の形で管理することが多いのではないでしょうか
- 「1」の場合は男性
- 「2」の場合は女性
genderカラムで「男性」「女性」と文字列が重複するのは気持ちが悪いので、小さいバイト数で管理できるこの形を採用するのではないでしょうか
何も間違っていないと思います
ここで登場するロジックが、以下です
- 取得するときに変換するロジック
- ユーザに数字で示すわけにはいかないため、数字から性別の文字列に変換しないといけない
- 挿入するときに変化するロジック
- データベースには文字列で挿入するわけにはいかないため、性別の文字列から数字に変換しないといけない
片方どちらかがない場合も考えられますが、今回は紹介のためにどちらも挙げます
悪い取得変換ロジック
以下に良くない取得変換ロジックを挙げます
初学者にめちゃめちゃありがちだと思います
僕もよくやりました、誰しもが通る道だと思います
class UserController
{
public function getUserInfo()
{
$user = User::find(Auth::id());
if($user->gender === 1){
$user->gender = '男性';
}else{
$user->gender = '女性';
}
//以下略
}
}
もしくは、laravel blade側で変換するタイプです。
<li>{{ $user->gender === 1 ? '男性' : '女性' }}</li>
もしくは
@php
if($user->gender === 1){
echo '<p>男性</p>';
}else{
echo '<p>女性</p>';
}
@endphp
初学者の方はまだあまり知らなくて良いことですが、
エンジニアリングにおいて、基本的にフロント側で何か処理をさせることは好ましくありません
責務が異なるためです
これらの稚拙な処理、自動化させたくありません?
ここで登場するのがアクセサ・ミューテタです!
使い方
ここからはLaravelのバージョンによって、少し書き方が変わってきます。
バージョンごとに紹介していきます
ソースコードは性別変換です
Laravel 8まで
class User extends Model
{
public function getGenderAttribute($value)
{
return $value === 1 ? '男性' : '女性' ;
}
}
宣言するメソッド名は「get〇〇Attribute」です
〇〇内はプロパティ名をキャメルアッパーで書きましょう
これで大丈夫です
$user->genderとプロパティを取得すると変換してくれます
Laravel 9以降
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
protected function gender(): Attribute
{
return Attribute::make(
get : fn($value) => $value === 1 ? '男性' : '女性',
set : fn($value) => $value === '男性' ? 1 : 2
)
}
}
こちらでは書き方が大きく変わります
メソッド名はそのままプロパティ名のみ
その中で、アクセサとミューテタどちらも定義できます
genderというプロパティ名を持つメソッドの中で、アクセサとミューテタどちらも定義できるというのは、とても感覚的で良いです!
終わり
Laravelはバージョンごとで書き方がかなり変わります
Laravelって良いですね、最近また自分の中でブームが到来しています
より難しいことを学習したい、プロダクトのソースコードを読みたい気持ち
我ながら、本当の意味で技術に意欲のある新卒もなかなかいないと思うんですよね
これを純粋なまま持ち続けることができれば、きっとさらに成長できるのでしょう