websanova/easycache

该包已被废弃,不再维护。未建议替代包。

为 Laravel 提供简单的按需缓存扩展。

v1.1.6 2015-10-16 09:33 UTC

This package is not auto-updated.

Last update: 2022-09-03 06:43:47 UTC


README

为 Laravel 提供简单的按需缓存扩展。

paginate()get() 类似,扩展以支持 cache()

安装

composer require websanova/easycache

示例

模型

$item = Item::cache($id);            // Get via integer.
$item = Item::cache($val);           // Get via string value.
$item = Item::cache($email, 'email') // Get from cache via email `$passthrough`.

集合

$items = Item::cache();         // Paginated, using `$perPage`.
$items = Item::cache(true, 40); // Paginated with custom.
$items = Item::cache(false);    // No pagination (`get`).

查询

我们也可以像平时一样构建查询。

$items = Item::active()->user()->cache();

$item = Item::cache($id);
$comments = $item->comments()->active()->cache();

注意方法 activeusercomments 都是任意的。

刷新、重置、重新计数

我们还有一些辅助方法,这些方法在模型和集合上都可以使用。

$item->flush();                      // Flush item.
$items->flush();                     // Flush all items.
$item->comments()->cache()->flush(); // Flush all comments.

$item->recount('comments_total');    // Reset `comments_total`.

$items->reset();                     // Flush and re-cache items.

设置

特质

该扩展以特质的形式提供,因此只需将其包含在您希望使用的任何模型中。

class Item extends \Illuminate\Database\Eloquent\Model
{
    use \Websanova\EasyCache\EasyCache;

    ...
}

通常最好创建一个 BaseModel 并在需要时只包含一次。

缓存

此时您可能想知道如何控制要缓存的内容。这由一个名为 cacheBy 的属性控制,默认设置为 id

根据此值,cache() 方法将调用一个名为此名称的函数(或作用域)。在此方法中,您指定实际要缓存的内容。

class Item extends \Illuminate\Database\Eloquent\Model
{
    use \Websanova\EasyCache\EasyCache;

    public function id()
    {
        return $this->select('id', 'slug', 'name')
                    ->active()
                    ->with('user');
    }

    ...
}

我喜欢使用简单的 id() 方法。但将其设置为 scopeId 也是很有用的,以便在不使用 cache 时重用。

请注意,由于 id() 方法实际上控制了数据,因此我们不需要在查询构建器中指定任何 select 参数。缓存将仅在 cacheBy 字段上工作。

方法

cache() passthrough

有时我们可能希望从缓存中获取一个通过 id 存储的项目,但通过不同的字段。一个很好的例子是按 emailfacebook_id 获取用户。我们不希望缓存相同的数据两次。这将在使用 passthrough 字段进行快速查找后,通过 id 获取模型。

User::cache('rob@websanova.com', 'email');

---

public function id()
{
    ...
}

public function email()
{
    return $this;
}

passthrough 字段将尝试找到一个同名方法,您可以在其中指定查找的额外参数。如果没有,只需返回 $this

flush()

这就像 Cache::flush() 方法一样工作。它将仅从缓存中删除项目。它也可以在集合上使用。

$item = Item::cache($id);

$item->flush();
$item->comments()->cache()->flush();

reset()

从缓存中清除项目并再次调用它们。这将对缓存中的模型执行完全重置。

$item = Item::cache($id);

$item->reset();
$item->comments()->cache()->reset();

recount()

实际上这与缓存无关,但它是一个常用的功能,通常与flushreset一起使用。

它执行完全重新计数,而不是增加或减少。这在出现错误时,total计数可能会很容易出错,因此更精确。可能不需要在每次请求时都这样做,但在重置总数时也很有用。

$item = Item::cache($id);

$item->recount('comments_total');                    // Will use `comments()` relation.
$item->recount('comments_total', 'commentsRecount'); // Specify relation to use for count.

recache()

这只是在缓存中覆盖一个项。对于增加和减少很有用。注意,这目前在集合中不可用。

$item = Item::cache($id);

$item->comments_total += 1;
$item->recache();

cacheInc()

这与Laravel的increment()方法类似。然而,在这种情况下,我们增加缓存中的值,并且只执行保存操作。

$item = Item::cache($id);

$item->cacheInc('comments_total');

我们还可以按数字增加,并指定一个乘数来执行实际的save操作。

$item->cacheInc('comments_total', 1, 10);

在这种情况下,我们每十次只执行一次save操作。

cacheDec()

调用cacheInc()方法,但作为负值。

$item = Item::cache($id);

$item->cacheDec('comments_total');

注意,你应该提供一个正数,而cacheDec会为你将其作为负数传递。

cacheOrFail()

类似于findOrFail(),但它与缓存的项一起工作。小的不同之处在于它目前只适用于模型,而不是集合。

Item::cacheOrFail($id);

如果找不到模型,它也会抛出与findOrFail相同的ModelNotFoundException

注意,如果模型未缓存,它将首先缓存它,然后返回它。

还有一个参数集或它可以接收的参数集的第二个参数。这是在你想要在缓存中保持更松散的模型集时使用的。例如,没有状态,这样所有“active”、“pending”等项都会被缓存。这允许你设置有用的附加参数,当进行路由模型绑定时。你可以在那里设置额外的参数来设置严格性。

Item::cacheOrFail($id, [
    'status' => 'active'
    ...
]);

参数

cached

这主要用于测试,但方便查找以了解模型是否实际上来自缓存。

cacheKey

此字段默认使用getTable()方法设置。但是,如果你在模型中有一个更复杂的类结构,你可以覆盖它。

它将使用此键缓存items如下

Cache::tags('items')->put('items-id-14', $model, $this->cacheTime);
Cache::tags('items')->put('items-slug-en', $model, $this->cacheTime);

cacheTime

项目在缓存中保留的时间长度。最好在具有适当覆盖的BaseModel中设置此值。

cacheBy

默认设置为id的我们将要缓存的字段。

附加

在某些情况下,我们可能需要将一些额外数据与我们的查询一起使用,这些数据不在缓存中存储。

我们希望利用Eloquent在使用with时自动构建我们的关系的方法。这在用户对某些项目的评分等情况下很有用。我们可以将项目存储在缓存中,但不将用户评分(至少不与项目一起)存储。

我们只需将其包含在我们的查询中,cache方法就会自动为我们构建它。

$items = Item::active()->orderBy('created_at')->with('score')->cache();

这将对获取score执行单一查询,而不是如果我们事先没有将其包含在查询中,则会执行多个查询。

许可证

Laravel Easy Cache遵循MIT许可证(MIT)