在分页查询的时候可以指定是否从缓存中获取数据,框架中开始设定的是ajax不走缓存,而非ajax才走缓存,这样做在后期做复杂业务的时候会有一定的局限性,所以编写了过滤器缓存依赖,用来指定根据提交的数据而进行自动判断是否从缓存中后期query数据。
<?php
namespace common\caching;
use yii\caching\Dependency;
use common\base\Filter;
/**
* Filter缓存依赖,根据指定的“get”、“post”、“request”的值,到提交的数据中进行查询返回对应的值,如果请求的数据发生变化则缓存失效
*
* @author niqingyang <niqy@qq.com>
*
*/
class FilterDependency extends Dependency
{
public $post = [];
public $request = [];
public $get = [];
public $defaults = [];
protected function generateDependencyData ($cache)
{
$data = [];
foreach((array)$this->get as $name)
{
$data[$name] = Filter::get($name, $this->defaults[$name]);
}
foreach((array)$this->post as $name)
{
$data[$name] = Filter::post($name, $this->defaults[$name]);
}
foreach((array)$this->request as $name)
{
$data[$name] = Filter::request($name, $this->defaults[$name]);
}
return $data;
}
}
可以用在pageList函数中:
/**
* 获取商品分页列表
*
* @param string $read_cache
* @param array $params
*/
public static function pageList ($read_cache = false, $params = [], Dependency $dependency = null)
{
// 分页设置
$filter = Filter::getInstance($read_cache);
if(isset($filter->query) && $filter->query instanceof Query)
{
$filter->page($filter->query);
return $filter;
}
$defaults = [
'shop_id' => null,
'goods_status' => null,
'goods_audit' => null
];
$params = ArrayHelper::merge($defaults, $params);
$query = new Query();
$query->select('*')->from(static::tableName())->orderBy([
'goods_id' => 'desc'
]);
// 状态
if(($goods_status = Filter::get('goods_status', $params['goods_status'])) !== null)
{
$query->andWhere([
'goods_status' => $goods_status
]);
}
// 加上缓存依赖
// 此处根据查询条件进行判断是否需要从缓存中读取数据
// 一旦指定的查询条件发生变化,则刷新缓存
$filter->page($query, new FilterDependency([
'get' => 'goods_status'
]));
return $filter;
}
通过下面的代码指定了,获取fitler的条件,一旦get提交的goods_status值发生变化则自动刷新缓存,这样无论是ajax还是非ajax都可以默认从缓存中读取数据了
// 加上缓存依赖
// 此处根据查询条件进行判断是否需要从缓存中读取数据
// 一旦指定的查询条件发生变化,则刷新缓存
$filter->page($query, new FilterDependency([
'get' => 'goods_status'
]));