開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. 【Laravel 9.0】Laravel 9に追加された方法でアクセサとミューテータを書く

【Laravel 9.0】Laravel 9に追加された方法でアクセサとミューテータを書く

いよいよ明日リリース予定のLaravel 9。
その変更点の中から、新しく追加されたアクセサとミューテータの定義の書き方をご紹介したいと思います。

これまでのアクセサ・ミューテータの書き方について


//class User extends Model

// アクセサ
public function getNameAttribute($value): string
{
    // 頭文字のみ大文字に変換
    return ucfirst($value);
}

// ミューテータ
public function setNameAttribute($name): void
{
    // 小文字に変換
    $this->attributes['name'] = strtolower($name);
}

これまでのアクセサ(ミューテータ)はget◯◯Attributeやset◯◯Attributeのように接頭(尾)辞を付与した名前のメソッドを作成することで使用することができました。

usersテーブルにnameカラムを持ち"yamada"が保存されている場合、下記のようにnameにアクセスすると"Yamada"が得られます。
これがアクセサ。
$user = \App\Models\User::find(1);

dd($user->name);

// "Yamada"

また、下記のように"Tanaka"を保存すると"tanaka"に変換された形でレコードに保存されます。
こちらがミューテータ。
$user = \App\Models\User::find(1);

$user->name = 'Tanaka';
$user->save();

Lalavel 9で追加された定義方法

上記と同じ動作をするアクセサ・ミューテータを新しく追加された方法で書いてみます。
use Illuminate\Database\Eloquent\Casts\Attribute;

public function name(): Attribute
{
    return new Attribute(
        // アクセサ
        get: fn($value) => ucfirst($value),
        // ミューテータ
        set: fn($value) => strtolower($value),
    );
}
メソッド名に接頭(尾)辞が付与されておらず、メソッドも1つにまとめられています。
また、戻り値の型をIlluminate\Database\Eloquent\Casts\Attribute にタイプヒントすることによりアクセサ・ミューテータが定義されます。
タイプヒントし忘れると定義されませんのでご注意ください。


上記はアロー関数で書かれていますが、もちろん以下のように書いても同じく定義できています。
public function name(): Attribute
{
    return new Attribute(
        get: function ($value) {
            return ucfirst($value);
        },
        set: function ($value) {
            return strtolower($value);
        },
    );
}

単一メソッドにシンプルに定義できるのがいいですね。

以上となります。ありがとうございました。

 
TOPに戻る