代码之家  ›  专栏  ›  技术社区  ›  Fredrik

与Laravel 5.6相关的总线缓存

  •  1
  • Fredrik  · 技术社区  · 6 年前

    我有一个叫 Tournament 其中每个 锦标赛 使用每个模型的键(即 tournament.1 )

    return \Cache::remember('tournament.' . $id, 60*24*7, function() use ($id) {
        return Tournament::where('id', $id)
            ->with(['prizes', 'sponsor'])
            ->firstOrFail();
    });
    

    当我更新关系时,我想忘记那场比赛的关键。我知道我可以使用这样的活动:

    public static function boot()
    {
        static::saving(function ($prize) {
            \Cache::forget('tournament.' . $prize->tournament->id);
        });
    
        return parent::boot();
    }
    

    但是,这样做意味着我还必须为所有其他关系重复此代码。我可能会为此创造一种特质,但有没有更好的方法来实现我想要实现的目标?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Fredrik    6 年前

    我最终用一种特质来解决这个问题。

    namespace App\Traits;
    
    trait ShouldCacheBust
    {
    /**
     * The "booting" method of the model.
     */
    public static function boot()
    {
        static::saving(function ($model) {
            $cacheKey = static::cacheBustKey($model);
    
            if ($cacheKey) {
                \Cache::forget($cacheKey);
            }
        });
    
        return parent::boot();
    }
    
    /**
     * Return the key to be removed from Cache
     * 
     * @param Model $model
     * @return string|null
     */
    abstract public function cacheBustKey(Model $model);
    }
    

    然后像这样使用它:

    /**
     * Return the key to be removed from Cache
     *
     * @param Model $model
     * @return mixed|string
     */
    public static function cacheBustKey(Model $model)
    {
        return 'tournament.' . $model->id;
    }