Laravel Lighthouse私有缓存无法通过@clearCache清除问题求助
问题分析与解决办法
你的问题出在私有缓存的键结构和普通缓存不同:Lighthouse的私有缓存会在缓存键中加入当前认证用户的标识(比如用户ID),而你用@clearCache(type: "User")只清除了该User类型的公共缓存条目,并没有触达关联用户的私有缓存,所以me查询依然返回旧的私有缓存数据。
下面给你两种可行的解决方式:
方式一:修改@clearCache指令参数,直接清除私有缓存
Lighthouse 6的@clearCache指令支持private参数,设置为true后会清除指定类型关联的私有缓存。你只需要修改你的Mutation定义:
extend type Mutation @guard { userCacheClear(usr_id: ID!): User @update @clearCache(type: "User", idSource: {argument: "usr_id"}, private: true) }
这个参数会让Lighthouse生成包含用户标识的私有缓存键,并清除对应的条目,这样me查询的缓存就会被清理掉。
方式二:自定义Resolver手动清除缓存
如果方式一不生效,你可以写自定义Resolver,手动生成私有缓存的键并删除:
- 先创建Resolver文件
app/GraphQL/Mutations/UserCacheClear.php:
<?php namespace App\GraphQL\Mutations; use App\Models\User; use Nuwave\Lighthouse\Support\Cache\CacheKeyGenerator; use Illuminate\Support\Facades\Cache; class UserCacheClear { public function resolve($root, array $args) { $user = User::findOrFail($args['usr_id']); // 清除"me"查询的私有缓存 $meCacheKey = app(CacheKeyGenerator::class)->generate( 'Query.me', [], // me查询没有变量,所以传空数组 $user // 要清除缓存的目标用户 ); Cache::forget($meCacheKey); // 清除User类型的私有缓存(可选,如果还有其他关联该用户的私有缓存) $userTypeCacheKey = app(CacheKeyGenerator::class)->generateType( 'User', $user->usr_id, $user ); Cache::forget($userTypeCacheKey); return $user; } }
- 修改Mutation的GraphQL定义,使用这个自定义Resolver:
extend type Mutation @guard { userCacheClear(usr_id: ID!): User @field(resolver: "App\\GraphQL\\Mutations\\UserCacheClear@resolve") }
这样调用userCacheClear后,就能精准清除目标用户的me查询私有缓存了。
内容的提问来源于stack exchange,提问作者Kipras Bielinskas
相关产品推荐
相关产品推荐

