もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

Laravel-PermissionのRoleやPermissionをInertiaに送る

はじめに

こんばんは。

Laravel-Permissionを使用している状態でLaravel + Inertia環境下で、RoleやPermissionを送るための方法を備忘録で残しておきます。

本題

方法は簡単で、HandleInertiaRequests でグローバルに送るのがよさそうです。

<?php

namespace App\Http\Middleware;

use App\Http\Resources\AuthResource;
use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Middleware;

class HandleInertiaRequests extends Middleware
{
    public function share(Request $request): array
    {
        /** @var User|null $user */
        $user = $request->user();

        return array_merge(parent::share($request), [
            'auth' => [
                'user' => $user ? new AuthResource($user) : null,
                // ↓これ↓
                'can'  => [
                    'permissions' => $user ? $user->getAllPermissions()->pluck('name') : [],
                    'roles'             => $user ? $user->roles()->pluck('name') : []
                ]
            ],
        ]);
    }
}

Inertia側はv-ifとかで判定すればOK

例えばパーミッションとかなら以下

<script>
import { usePage } from "@inertiajs/vue3";

const hasPermission = (permission: string | string[]): boolean => {
  const can = usePage().props.auth.can;

  if (!Array.isArray(permission)) {
    return can.permissions.indexOf(permission) !== -1;
  }

  let result = false;
  permission.map((p) => {
    if (can.permissions.indexOf(p) !== -1) {
      result = true;
    }
  });
  return result;
};
</script>

<template>
  <div>
    <p v-if="hasPermission('blog.write')">みえるよ</p>
    <p v-else>みえないよ</p>
  </div>
</template>

終わりに

最近勉強が全然出来てないので、ブログもおざなりになってきました。

勉強ができないくらい忙しいというわけではなく、モチベーションが上がってないという感じです。

ちょっと自己啓発的な本読んで、危機感とモチベーションを高めたいので、なにかおすすめ本あれば教えて下さい。

現場からは以上です。