安装spatie/laravel-permission后调用默认roles方法返回空如何解决
问题原因
Spatie 提供的默认 roles 关联会自动追加 guard_name 过滤条件,你自定义的关联没有该过滤逻辑,所以才会出现自定义方法能查到数据、默认方法返回空的情况。
解决步骤
- 第一步:确认已经发布扩展包配置文件,执行命令:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" - 第二步:修改身份验证 guard 匹配规则,二选一即可:
- 在
config/auth.php中修改 User 模型对应 guard 的驱动为api,同时在config/permission.php的defaults配置项中将guard值改为api - 直接在你的 User 模型中重写
guardName方法,指定使用apiguard 查询权限:
- 在
public function guardName() { return 'api'; }
- 第三步:清除 Spatie 权限缓存,避免缓存影响查询结果:
php artisan permission:cache-reset
可选验证步骤
如果修改后仍不生效,可以通过打印SQL确认过滤条件:
\DB::enableQueryLog(); \App\Models\User::find(1)->roles()->get(); dd(\DB::getQueryLog());
查看生成的 SQL 中 guard_name 的过滤值是否为 api,如果还是 web 说明 guard 配置未生效,检查上述配置步骤是否正确执行。
修改完成后再调用默认的 roles 方法即可正常返回角色数据。
内容的提问来源于stack exchange,提问作者trannguyenhan
相关产品推荐
相关产品推荐

