You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,手动生成私有缓存的键并删除:

  1. 先创建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;
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:03:12