アクセサとは
アクセサは、Eloquentのプロパティにアクセスが合った時に値を変換する処理のこと
ミューテタとは
ミューテタは、Eloquentのプロパティを設定するときに、その値を変換する処理のこと。
どういう時に便利か
例えば、ユーザ追加APIがあったとします。その機能では、ユーザテーブルにメールアドレスを登録するとき、暗号化して登録する必要があるとします。
その場合、メールアドレスを暗号化する処理をコントローラもしくはサービスに実装するかと思います。復号処理についても同様です。
しかし、仮に友達追加APIみたいなのがあった場合、上記の方法だと友達追加APIのコントローラ、サービスにも暗号化の処理を実装する必要があります。
見ての通り、各機能ごとに毎回記述するのは冗長した記述とも言えます。
そこで、メールアドレスを登録する際にミューテタを使用すれば、暗号化部分の処理を毎回記述する必要がなくなるのでシンプルになります。
ミューテタの記述方法
ミューテタの記述方法は以下の通りです。
/**
* emailの登録
*
* @param string $value
* @return void
*/
public function setEmailAttribute($value)
{
$this->attributes['email'] = Crypt::encryptString($value);
}
ミューテタを設定したいカラム名が「キャメルケース」でEmailの場合、UserモデルにsetEmailAttributeメソッドを作成します。
アクセサの記述方法
アクセサの記述方法は以下の通りです。
/**
* emailの取得
*
* @param string $value
* @return string
*/
public function getEmailAttribute($value)
{
return Crypt::decryptString($value);
}
アクセサを設定したいカラム名が「キャメルケース」でEmailの場合、UserモデルにgetEmailAttributeメソッドを作成します。
Laravel9での書き方
またLaravel9以降では以下の記述が可能です。(メソッド名はプロパティ名を「キャメルケース」にしたものです。)
public function email(): Attribute
{
return new Attribute(
// アクセサ
get: fn($value) => Crypt::decryptString($value),
// ミューテタ
set: fn($value) => Crypt::encryptString($value),
);
}
サンプル実装
実際に、任意のユーザのメールアドレスを登録する処理を書いてみます。
内容は以下の通りです。
$user = User::find(1);
$user->email = 'test@example.com';
メールアドレスの設定が終わり、ユーザテーブルを見ると以下の通り、メールアドレスが暗号化されています。
つまり、ミューテタが実行されていることがわかります。
id | |
---|---|
1 | eyJpdiI6IndrckpyQm9yUXlaWWpSRU1pemU4VWc9PSIsInZhbHVlIjoiWUl(…以下省略) |
プロパティにアクセスした時は以下の通り、きちんと復号化されています。
>>> User::find(1)->email
=> "test@example.com"
アクセサが実行されていることがわかります。
以上