Refactor cacheable widget behavior (#15608)

This commit is contained in:
Alexander Makarov
2018-02-06 13:30:37 +03:00
committed by GitHub
parent 37bd97ad9a
commit 846444d17e

View File

@ -3,6 +3,7 @@
namespace yii\behaviors; namespace yii\behaviors;
use yii\base\Behavior; use yii\base\Behavior;
use yii\base\InvalidConfigException;
use yii\base\Widget; use yii\base\Widget;
use yii\base\WidgetEvent; use yii\base\WidgetEvent;
use yii\caching\CacheInterface; use yii\caching\CacheInterface;
@ -117,14 +118,10 @@ class CacheableWidgetBehavior extends Behavior
*/ */
public function beforeRun($event) public function beforeRun($event)
{ {
$cacheConfig = [ $cacheKey = $this->getCacheKey();
'cache' => Instance::ensure($this->cache, 'yii\caching\CacheInterface'), $fragmentCacheConfiguration = $this->getFragmentCacheConfiguration();
'duration' => $this->cacheDuration,
'dependency' => $this->cacheDependency,
'enabled' => $this->cacheEnabled,
];
if (!$this->owner->view->beginCache($this->getCacheKey(), $cacheConfig)) { if (!$this->owner->view->beginCache($cacheKey, $fragmentCacheConfiguration)) {
$event->isValid = false; $event->isValid = false;
} }
} }
@ -143,10 +140,36 @@ class CacheableWidgetBehavior extends Behavior
} }
/** /**
* Returns widget cache key. * Initializes widget event handlers.
*/
private function initializeEventHandlers()
{
$this->owner->on(Widget::EVENT_BEFORE_RUN, [$this, 'beforeRun']);
$this->owner->on(Widget::EVENT_AFTER_RUN, [$this, 'afterRun']);
}
/**
* Returns the cache instance.
*
* @return CacheInterface cache instance.
* @throws InvalidConfigException if cache instance instantiation fails.
*/
private function getCacheInstance()
{
$cacheInterface = 'yii\caching\CacheInterface';
$cache = Instance::ensure($this->cache, $cacheInterface);
return $cache;
}
/**
* Returns the widget cache key.
*
* @return string[] an array of strings representing the cache key.
*/ */
private function getCacheKey() private function getCacheKey()
{ {
// `$cacheKeyVariations` may be a `string` and needs to be cast to an `array`.
$cacheKey = array_merge( $cacheKey = array_merge(
(array)get_class($this->owner), (array)get_class($this->owner),
(array)$this->cacheKeyVariations (array)$this->cacheKeyVariations
@ -156,11 +179,20 @@ class CacheableWidgetBehavior extends Behavior
} }
/** /**
* Initializes widget event handlers. * Returns a fragment cache widget configuration array.
*
* @return array a fragment cache widget configuration array.
*/ */
private function initializeEventHandlers() private function getFragmentCacheConfiguration()
{ {
$this->owner->on(Widget::EVENT_BEFORE_RUN, [$this, 'beforeRun']); $cache = $this->getCacheInstance();
$this->owner->on(Widget::EVENT_AFTER_RUN, [$this, 'afterRun']); $fragmentCacheConfiguration = [
'cache' => $cache,
'duration' => $this->cacheDuration,
'dependency' => $this->cacheDependency,
'enabled' => $this->cacheEnabled,
];
return $fragmentCacheConfiguration;
} }
} }