我们知道yii2内置了很多行为,比如时间戳自动更新、自动赋值登录会员ID的,具体可以参考我之前写的 Yii2行为研究 专题,在2.0.14版上又增加了这个 CacheableWidgetBehavior 行为。
用意很简单,可以将一个小挂件缓存下来,行为对配置要求非常低,通常情况下你只需支持cache组件即可。
接下来我用最简单的语言写个小教程,希望可以为你抛砖引玉。
话说一个风和日丽的早上,我的老板给我说了如下需求:
小阿北啊,你给咱网站做个最新发帖10条的区块吧。 🐸🐸🐸🐸 好的。
既然是一个区块,我自然想到了小挂件,说干咱就干,于是我写下了如下代码
构造小挂件
我新建了一个小挂件叫NewPost.php
// @app/components/NewPost.php
namespace app\components;
use yii\base\Widget;
use app\models\Post;
class NewPost extends Widget {
public function init(){
parent::init();
}
public function run(){
parent::run();
$data = Post::find()->orderBy(["created_at"=>SORT_DESC])->limit(10)->all();
return $this->render('new_post',[
'data'=>$data
]);
}
}复制代码
然后在 @app/components/views 下建立对应的视图new_post.php
// new_post.php
<ul>
<?php foreach($data as $post):?>
<li>
<?= $post->title;?>
</li>
<?php endforeach;?>
</ul>复制代码
融入行为
考虑到公司社区冷清的人气,我决定使用yii2这2.0.14中的CacheableWidgetBehavior行为对这个挂件进行缓存。
// @app/components/NewPost.php
...
use yii\behaviors\CacheableWidgetBehavior;
class NewPost extends Widget {
...
public function behaviors(){
return [
[
'class' => CacheableWidgetBehavior::className(),
'cacheDuration' => 60,
]
];
}
...
}复制代码
这样设置后会对整个挂件进行缓存,我通过cacheDuration参数设置有效期为60秒,不写也是默认60秒,接下来是见证奇迹的时候。
既然是缓存,那我们来看看runtime/cache文件夹
老板的回复
当我兴致高高的拿给老板看的时候,老板一份假正经的说:“小北呀,这样不好吧,我还是要有新帖这里就马上能看到,否则用户体验不好的,在想想办法?既能减少数据库压力还能保证第一时间!!”
哦,好在哥还有一招。
看代码
//@app/components/NewPost.php
public function behaviors(){
return [
[
'class' => CacheableWidgetBehavior::className(),
'cacheDuration' => 0,
'cacheDependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
]
]
];
}复制代码
我设置了cacheDuration=0代表永远不过期,然后添加cacheDependency项,为行为增加一个数据库依赖,存储帖子最新的更新时间,这样当有新的帖子进来后,则updated_at变化导致缓存失效,然后从新查询新帖后重新建立。
测试成功,大喜。
一溜烟的跑到老板处并获得了准点下班的福利。
额外的
既然用了CacheableWidgetBehavior,还有必要说下cacheKeyVariations变量,一般配置如下
public function behaviors(){
return [
[
'class' => CacheableWidgetBehavior::className(),
'cacheDuration' => 0,
'cacheKeyVariations' => 1
]
];
}复制代码
cacheKeyVariations可以是一个字符串或一个数组,当cacheKeyVariations的值发生变化后也会导致缓存重新建立。具体如何使用要看大家需求了。
以上就是关于CacheableWidgetBehavior的一些用法,希望这个2.0.14新增的内置行为为你的开发带来便利。