アクセサが便利なのでまとめてみる件【Laravel 8系】


とにかくforeachとif文でやれたけど…

今回は実務で初めて知ったLaravelの便利な使い方をまとめていきます。

どんなことを実務でやったのかというと例えば

class UserController extends Controller
{
    public function index()
    {
         $users = User::all();
         return view('users.index', compact('users'));
    }
}

というコントローラがありviewでUserを一覧で表示するみたいなことは
割と良くやることかなと思います。

@foreach ($users as $user)
    {{ $user->name }}さん
    {{ $user->email }}
    続く
@endforeach

そんなときに今回のUserのDB情報には権限(role)カラムがあって
管理者(1)と編集者(2)と言った1か2の値を持っていて
それに対して自分は下記の実装を行った

@foreach ($users as $user)
    {{ $user->name }}さん
    {{ $user->email }}
    @if ($user->role === 1)
        管理者
    @else 
        編集者
    @endif
@endforeach

上記の実装は別になにか悪いわけではない
ただ今回の案件では上記のようなコードが他に2〜3箇所書くことになっていて
共通箇所があるならまとめようとレビュワーから言われて
初めてアクセサのことを知ったのが今回の記事の経緯です!

一体何をするのか

実際のコードを書く前に
レビュワーからは

共通箇所があるならまとめよう

の他にも言われてアクセサを使用することに至った。

ifの条件で'1'と書かれてそれが管理者に繋がる意図がviewだけではわからない

最近良いコードについての記事を見ている自分からしたら
まさにわからないですね!と前のめりで共感した。
さっそくコードを書いてみよう

今回はUser絡みの対応なので
UserModelで下記のようなコードを書く

class User extends Model
{
    public const ADMIN = 1;
    public const EDITOR = 2;
    public const ROLENAMES = [
        self::ADMIN => '管理者',
        self::EDITOR => '編集者'
    ];

    public function retriveRoleNameAttribute()
    {
        teturn self::ROLENAMES[$this->role];
    }
}

と言った感じに
対象のmodelにget{Attribute}Attributeメソッドを作成する
{Attribute}はアクセスするカラムのアッパーキャメルケースの名前です。
今回はretrive{RoleName}Attributeとしてます。

これを先程のviewで使用します。

@foreach ($users as $user)
    {{ $user->name }}さん
    {{ $user->email }}
    {{ $user->role_name }} // 管理者or編集者が表示される
@endforeach

ふぁ〜!!!
if文が無くなってめっちゃすっきりしましたね。
また、権限を返していることも明確にわかるのでこれはいい
便利すぎる。
今後必要なときにはしっかりと使っていくようにします。

最後までありがとうございます。LGTM押してくれるとうれしいです!
誤っている点やもっといいやり方などありましたらコメント頂けるとありがたいです!

参考

laravel.jp