🐣

Laravel 新型アクセサ/ミューテタを試してみた

2021/12/22に公開

前書き

Laravel Ver.8.77 で追加された新型アクセサ/ミューテタ機能を試してみました。
(この機能を使うには、PHP8 以上が必要です)

以前からある getHogeAttribute / setHogeAttribute 形式は、今後もサポートされます。
ただ、ドキュメントは置き換わってしまうとか。(執筆時点ではまだ以前のままです)

参考:Attribute Cast / Accessor Improvements #40022
参考:Laravel 8.x Eloquent:ミューテタ/キャスト

本題

ということで、Models/User.php に以下の感じで追記してみます。

User.php
use Illuminate\Database\Eloquent\Casts\Attribute;  // ← 名前空間も忘れずに

class User extends Authenticatable
{

    protected function name(): Attribute
    {
        return new Attribute(
            get: fn ($value) => strtoupper($value),
            set: fn ($value) => $value.' 様',
        );
    }
}

web.php に以下の感じで記述してみます。

web.php
Route::get('/', function () {
    $user = new User();

    $user->name = 'foo bar';

    return $user->name;
});

すると、以下の感じで出力されました。

FOO BAR 様

get: / set: の設定はどちらか一方だけでも大丈夫です。これは、PHP8 から導入された「名前付き引数」という機能ですので、PHP8 以上が必須になりますね。

雑感

凄いですね。
まぁ個人的には、アクセサ/ミューテタは、あまり使わなかったりもしますが…。

おかしな箇所等あったらコメント下さい。

Discussion