From 0ed14a741d2c13f66e2023823975287694845621 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Mon, 25 Mar 2013 23:11:32 -0400 Subject: [PATCH] Finished PageCache. --- framework/web/PageCache.php | 110 ++++++++++++++++++++++++++++++++++++ framework/widgets/FragmentCache.php | 2 +- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 framework/web/PageCache.php diff --git a/framework/web/PageCache.php b/framework/web/PageCache.php new file mode 100644 index 0000000..24cddea --- /dev/null +++ b/framework/web/PageCache.php @@ -0,0 +1,110 @@ + + * @since 2.0 + */ +class PageCache extends ActionFilter +{ + /** + * @var boolean whether the content being cached should be differentiated according to the route. + * A route consists of the requested controller ID and action ID. Defaults to true. + */ + public $varyByRoute = true; + /** + * @var View the view object that is used to create the fragment cache widget to implement page caching. + * If not set, the view registered with the application will be used. + */ + public $view; + + /** + * @var string the ID of the cache application component. Defaults to 'cache' (the primary cache application component.) + */ + public $cacheID = 'cache'; + /** + * @var integer number of seconds that the data can remain valid in cache. + * Use 0 to indicate that the cached data will never expire. + */ + public $duration = 60; + /** + * @var array|Dependency the dependency that the cached content depends on. + * This can be either a [[Dependency]] object or a configuration array for creating the dependency object. + * For example, + * + * ~~~ + * array( + * 'class' => 'yii\caching\DbDependency', + * 'sql' => 'SELECT MAX(lastModified) FROM Post', + * ) + * ~~~ + * + * would make the output cache depends on the last modified time of all posts. + * If any post has its modification time changed, the cached content would be invalidated. + */ + public $dependency; + /** + * @var array list of factors that would cause the variation of the content being cached. + * Each factor is a string representing a variation (e.g. the language, a GET parameter). + * The following variation setting will cause the content to be cached in different versions + * according to the current application language: + * + * ~~~ + * array( + * Yii::$app->language, + * ) + */ + public $variations; + /** + * @var boolean whether to enable the fragment cache. You may use this property to turn on and off + * the fragment cache according to specific setting (e.g. enable fragment cache only for GET requests). + */ + public $enabled = true; + + + public function init() + { + parent::init(); + if ($this->view === null) { + $this->view = Yii::$app->getView(); + } + } + + /** + * This method is invoked right before an action is to be executed (after all possible filters.) + * You may override this method to do last-minute preparation for the action. + * @param Action $action the action to be executed. + * @return boolean whether the action should continue to be executed. + */ + public function beforeAction($action) + { + $properties = array(); + foreach (array('cacheID', 'duration', 'dependency', 'variations', 'enabled') as $name) { + $properties[$name] = $this->$name; + } + $id = $this->varyByRoute ? $action->getUniqueId() : __CLASS__; + return $this->view->beginCache($id, $properties); + } + + /** + * This method is invoked right after an action is executed. + * You may override this method to do some postprocessing for the action. + * @param Action $action the action just executed. + */ + public function afterAction($action) + { + $this->view->endCache(); + } +} \ No newline at end of file diff --git a/framework/widgets/FragmentCache.php b/framework/widgets/FragmentCache.php index 3bb321e..d5185f8 100644 --- a/framework/widgets/FragmentCache.php +++ b/framework/widgets/FragmentCache.php @@ -62,7 +62,7 @@ class FragmentCache extends Widget */ public $enabled = true; /** - * @var \yii\base\View the view object within which this widget is sued. If not set, + * @var \yii\base\View the view object within which this widget is used. If not set, * the view registered with the application will be used. This is mainly used by dynamic content feature. */ public $view;