123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace yii\behaviors;
- use yii\base\Behavior;
- use yii\base\InvalidConfigException;
- use yii\base\Widget;
- use yii\base\WidgetEvent;
- use yii\caching\CacheInterface;
- use yii\caching\Dependency;
- use yii\di\Instance;
- class CacheableWidgetBehavior extends Behavior
- {
-
- public $cache = 'cache';
-
- public $cacheDuration = 60;
-
- public $cacheDependency;
-
- public $cacheKeyVariations = [];
-
- public $cacheEnabled = true;
-
- public function attach($owner)
- {
- parent::attach($owner);
- $this->initializeEventHandlers();
- }
-
- public function beforeRun($event)
- {
- $cacheKey = $this->getCacheKey();
- $fragmentCacheConfiguration = $this->getFragmentCacheConfiguration();
- if (!$this->owner->view->beginCache($cacheKey, $fragmentCacheConfiguration)) {
- $event->isValid = false;
- }
- }
-
- public function afterRun($event)
- {
- echo $event->result;
- $event->result = null;
- $this->owner->view->endCache();
- }
-
- private function initializeEventHandlers()
- {
- $this->owner->on(Widget::EVENT_BEFORE_RUN, [$this, 'beforeRun']);
- $this->owner->on(Widget::EVENT_AFTER_RUN, [$this, 'afterRun']);
- }
-
- private function getCacheInstance()
- {
- $cacheInterface = 'yii\caching\CacheInterface';
- return Instance::ensure($this->cache, $cacheInterface);
- }
-
- private function getCacheKey()
- {
-
- $cacheKey = array_merge(
- (array)get_class($this->owner),
- (array)$this->cacheKeyVariations
- );
- return $cacheKey;
- }
-
- private function getFragmentCacheConfiguration()
- {
- $cache = $this->getCacheInstance();
- $fragmentCacheConfiguration = [
- 'cache' => $cache,
- 'duration' => $this->cacheDuration,
- 'dependency' => $this->cacheDependency,
- 'enabled' => $this->cacheEnabled,
- ];
- return $fragmentCacheConfiguration;
- }
- }
|