MDL-36322 cache: implemented cache_store::create_clone

This commit is contained in:
Sam Hemelryk
2013-02-01 08:49:03 +13:00
parent 5dfa3031a8
commit 79c55ca344
2 changed files with 25 additions and 1 deletions
+7 -1
View File
@@ -263,7 +263,13 @@ class cache_factory {
if (!$store->is_ready() || !$store->is_supported_mode($definition->get_mode())) {
return false;
}
$store = clone($this->stores[$name]);
// We always create a clone of the original store.
// If we were to clone a store that had already been initialised with a definition then
// we'd run into a myriad of issues.
// We use a method of the store to create a clone rather than just creating it ourselves
// so that if any store out there doesn't handle cloning they can override this method in
// order to address the issues.
$store = $this->stores[$name]->create_clone($details);
$store->initialise($definition);
return $store;
}
+18
View File
@@ -306,4 +306,22 @@ abstract class cache_store implements cache_store_interface {
public function supports_native_ttl() {
return $this::get_supported_features() & self::SUPPORTS_NATIVE_TTL;
}
/**
* Creates a clone of this store instance ready to be initialised.
*
* This method is used so that a cache store needs only be constructed once.
* Future requests for an instance of the store will be given a cloned instance.
*
* If you are writing a cache store that isn't compatible with the clone operation
* you can override this method to handle any situations you want before cloning.
*
* @param array $details An array containing the details of the store from the cache config.
* @return cache_store
*/
public function create_clone(array $details = array()) {
// By default we just run clone.
// Any stores that have an issue with this will need to override the create_clone method.
return clone($this);
}
}