在Rebing GraphQL中使用Spatie Roles库始终返回NULL
问题:GraphQL查询用户角色时
getRoleNames()始终返回NULL 相关代码
所用文件
<?php namespace App\GraphQl\Query\User; use App\GraphQl\Traits\UserTrait; use App\Models\User; use GraphQL\Type\Definition\ResolveInfo; use Rebing\GraphQL\Support\Facades\GraphQL; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Query;
GraphQL UserRolesQuery文件
use Closure; class UserRolesQuery extends Query { use UserTrait; protected $attributes = [ 'name' => 'user', ]; public function type(): Type { return GraphQL::type('UserType'); } public function args(): array { return [ 'id' => [ 'name' => 'id', 'type' => Type::int(), // 'rules' => ['required'] validation ] ]; } public function resolve($root, array $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields) { $user = User::find($args['id']); $result = $user->getRoleNames(); return $result; } }
问题排查与解决步骤
确认User模型是否引入权限Trait
如果你用的是Spatie的Laravel Permission包,User模型必须引入Spatie\Permission\Traits\HasRolesTrait,否则getRoleNames()方法不存在,调用后会返回null或报错。检查你的User模型:use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasRoles; // 必须包含这一行 // ...其他代码 }检查用户与角色的数据库关联
直接查看model_has_roles表,确认目标user_id对应的关联记录是否存在,且关联的role_id有效。如果数据库里没有关联数据,getRoleNames()自然返回空集合(表现为null)。处理用户不存在的情况
User::find($args['id'])找不到用户时会返回null,此时调用getRoleNames()会触发错误,最终返回null。先判断用户是否存在:public function resolve($root, array $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields) { if (!isset($args['id'])) { return null; } $user = User::find($args['id']); if (!$user) { return null; } return $user->getRoleNames(); }修正GraphQL返回类型不匹配问题
当前Query的type()返回UserType,但getRoleNames()返回的是角色名称集合,类型不匹配会导致GraphQL解析失败,最终返回null。需要修改返回类型为字符串列表:public function type(): Type { return Type::listOf(Type::string()); // 返回字符串列表类型 }若要返回完整角色结构,需定义
RoleType,再返回Type::listOf(GraphQL::type('RoleType'))。确认权限包配置与迁移
检查config/permission.php配置是否正确,确认roles、permissions、model_has_roles等表已通过迁移创建完成。
内容的提问来源于stack exchange,提问作者ahmad ali
相关产品推荐
相关产品推荐

