【问题标题】:Cannot use `roles` method default of Laravel Permission Spatie不能使用 Laravel Permission Spatie 的“roles”方法默认值
【发布时间】:2023-09-28 15:05:01
【问题描述】:

我安装了 spatie/laravel-permission,但我不能使用 role 默认的 spaite 方法。 在User 模型中,我添加了HasRoles

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use HasApiTokens, HasFactory, Notifiable, HasRoles;

    const ACTIVE = 'active';
    const LOCKED = 'locked';

    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'name',
        'username',
        'status',
        'email',
        'password',
        'password_updated_at'
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

//    public function roles(): BelongsToMany
//    {
//        return $this->belongsToMany(\App\Models\Role::class, 'user_has_roles', 'user_id');
//    }

    public function getJWTIdentifier() {
        return $this->getKey();
    }

    public function getJWTCustomClaims() {
        return [];
    }
}

如果我定义新的 roles 方法覆盖 spatie 的方法(评论部分),我将从代码中获取角色:

\App\Models\User::find(1)->first()->roles()->get()->toArray()

结果是:

array:1 [
  0 => array:6 [
    "id" => 1
    "name" => "admin"
    "guard_name" => "api"
    "created_at" => "2021-10-19T18:23:20.000000Z"
    "updated_at" => "2021-10-19T18:23:20.000000Z"
    "pivot" => array:2 [
      "user_id" => 1
      "role_id" => 1
    ]
  ]
]

但是如果我使用roles 方法默认下面的 spatie 代码不是结果,这是我运行时的结果:

[]

我找了很多,但没有结果,希望有人能帮助我,谢谢。

【问题讨论】:

  • auth()-&gt;user()-&gt;roles;的结果是什么
  • 结果为:Illuminate\Database\Eloquent\Collection {#1096 #items: [] }

标签: php laravel laravel-permission


【解决方案1】:

Spatie Laravel 权限不使用roles 方法。

正确的方法:

$roles = $user-&gt;getRoleNames(); // Returns a collection

文档:https://spatie.be/docs/laravel-permission/v5/basic-usage/basic-usage

P/s: Anh em cần hỏi thêm gì thì cứ gửi tin nhắn。

【讨论】:

  • cáiHàm角色m i nhnóiởlàcáiormm m m minnónónónốivớivớibảng用户,docáinày -nàyn基nốivàovàovàovàokhowngkhôngngkhônsaphoungnc phang the anc phancphancrứ Ví dụ như cái getRoleName mà bạn bảo nếu mình ghi đè lại con role method của Spatie thì nó sẽ ra kết quả là: ``` Illuminate\Support\Collection {#361 #items: array:1 [ 0 => "admin" ] } ``` còn nêu không ghi đè mà để mặc định thì kết quả sẽ ra là: ``` Illuminate\Support\Collection {#361 #items: [] } ```
  • Không cần phải dùng 方法role nữa。 Dùng Trait là được: use Spatie\Permission\Traits\HasRoles;