websanova / easycache
为 Laravel 提供简单的按需缓存扩展。
Requires
- php: >=5.3.0
- illuminate/support: ~5
Requires (Dev)
- phpunit/phpunit: ~4.0
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();
注意方法 active
、user
和 comments
都是任意的。
刷新、重置、重新计数
我们还有一些辅助方法,这些方法在模型和集合上都可以使用。
$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
存储的项目,但通过不同的字段。一个很好的例子是按 email
或 facebook_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()
实际上这与缓存无关,但它是一个常用的功能,通常与flush
和reset
一起使用。
它执行完全重新计数,而不是增加或减少。这在出现错误时,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)。