diff --git a/lib/Cake/Cache/Cache.php b/lib/Cake/Cache/Cache.php index c7c593916ea..875c307e5d1 100644 --- a/lib/Cake/Cache/Cache.php +++ b/lib/Cake/Cache/Cache.php @@ -542,4 +542,27 @@ public static function groupConfigs($group = null) { throw new CacheException(__d('cake_dev', 'Invalid cache group %s', $group)); } +/** + * Provides the ability to easily do read-through caching. + * + * When called if the $key is not set in $config, the $callable function + * will be invoked. The results will then be stored into the cache config + * at key. + * + * @param string $key The cache key to read/store data at. + * @param callable $callable The callable that provides data in the case when + * the cache key is empty. + * @param string $config The cache configuration to use for this operation. + * Defaults to default. + */ + public static function remember($key, $callable, $config = 'default') { + $existing = self::read($key, $config); + if ($existing !== false) { + return $existing; + } + $results = call_user_func($callable); + self::write($key, $results, $config); + return $results; + } + } diff --git a/lib/Cake/Test/Case/Cache/CacheTest.php b/lib/Cake/Test/Case/Cache/CacheTest.php index 9b427955181..cd00bbba289 100644 --- a/lib/Cake/Test/Case/Cache/CacheTest.php +++ b/lib/Cake/Test/Case/Cache/CacheTest.php @@ -27,6 +27,8 @@ */ class CacheTest extends CakeTestCase { + protected $_count = 0; + /** * setUp method * @@ -491,4 +493,28 @@ public function testSetOnAlternateConfigs() { $this->assertEquals('test_file_', $settings['prefix']); $this->assertEquals(strtotime('+1 year') - time(), $settings['duration']); } + +/** + * test remember method. + * + * @return void + */ + public function testRemember() { + $expected = 'This is some data 0'; + $result = Cache::remember('test_key', [$this, 'cacher'], 'default'); + $this->assertEquals($expected, $result); + + $this->_count = 1; + $result = Cache::remember('test_key', [$this, 'cacher'], 'default'); + $this->assertEquals($expected, $result); + } + +/** + * Method for testing Cache::remember() + * + * @return string + */ + public function cacher() { + return 'This is some data ' . $this->_count; + } }