1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Cache;
16:
17: use BadMethodCallException;
18: use Cake\Core\App;
19: use Cake\Core\ObjectRegistry;
20: use RuntimeException;
21:
22: /**
23: * An object registry for cache engines.
24: *
25: * Used by Cake\Cache\Cache to load and manage cache engines.
26: */
27: class CacheRegistry extends ObjectRegistry
28: {
29:
30: /**
31: * Resolve a cache engine classname.
32: *
33: * Part of the template method for Cake\Core\ObjectRegistry::load()
34: *
35: * @param string $class Partial classname to resolve.
36: * @return string|false Either the correct classname or false.
37: */
38: protected function _resolveClassName($class)
39: {
40: if (is_object($class)) {
41: return $class;
42: }
43:
44: return App::className($class, 'Cache/Engine', 'Engine');
45: }
46:
47: /**
48: * Throws an exception when a cache engine is missing.
49: *
50: * Part of the template method for Cake\Core\ObjectRegistry::load()
51: *
52: * @param string $class The classname that is missing.
53: * @param string $plugin The plugin the cache is missing in.
54: * @return void
55: * @throws \BadMethodCallException
56: */
57: protected function _throwMissingClassError($class, $plugin)
58: {
59: throw new BadMethodCallException(sprintf('Cache engine %s is not available.', $class));
60: }
61:
62: /**
63: * Create the cache engine instance.
64: *
65: * Part of the template method for Cake\Core\ObjectRegistry::load()
66: *
67: * @param string|\Cake\Cache\CacheEngine $class The classname or object to make.
68: * @param string $alias The alias of the object.
69: * @param array $config An array of settings to use for the cache engine.
70: * @return \Cake\Cache\CacheEngine The constructed CacheEngine class.
71: * @throws \RuntimeException when an object doesn't implement the correct interface.
72: */
73: protected function _create($class, $alias, $config)
74: {
75: if (is_object($class)) {
76: $instance = $class;
77: }
78:
79: unset($config['className']);
80: if (!isset($instance)) {
81: $instance = new $class($config);
82: }
83:
84: if (!($instance instanceof CacheEngine)) {
85: throw new RuntimeException(
86: 'Cache engines must use Cake\Cache\CacheEngine as a base class.'
87: );
88: }
89:
90: if (!$instance->init($config)) {
91: throw new RuntimeException(
92: sprintf('Cache engine %s is not properly configured.', get_class($instance))
93: );
94: }
95:
96: $config = $instance->getConfig();
97: if ($config['probability'] && time() % $config['probability'] === 0) {
98: $instance->gc();
99: }
100:
101: return $instance;
102: }
103:
104: /**
105: * Remove a single adapter from the registry.
106: *
107: * @param string $name The adapter name.
108: * @return void
109: */
110: public function unload($name)
111: {
112: unset($this->_loaded[$name]);
113: }
114: }
115: