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: * Resolve a cache engine classname.
31: *
32: * Part of the template method for Cake\Core\ObjectRegistry::load()
33: *
34: * @param string $class Partial classname to resolve.
35: * @return string|false Either the correct classname or false.
36: */
37: protected function _resolveClassName($class)
38: {
39: if (is_object($class)) {
40: return $class;
41: }
42:
43: return App::className($class, 'Cache/Engine', 'Engine');
44: }
45:
46: /**
47: * Throws an exception when a cache engine is missing.
48: *
49: * Part of the template method for Cake\Core\ObjectRegistry::load()
50: *
51: * @param string $class The classname that is missing.
52: * @param string $plugin The plugin the cache is missing in.
53: * @return void
54: * @throws \BadMethodCallException
55: */
56: protected function _throwMissingClassError($class, $plugin)
57: {
58: throw new BadMethodCallException(sprintf('Cache engine %s is not available.', $class));
59: }
60:
61: /**
62: * Create the cache engine instance.
63: *
64: * Part of the template method for Cake\Core\ObjectRegistry::load()
65: *
66: * @param string|\Cake\Cache\CacheEngine $class The classname or object to make.
67: * @param string $alias The alias of the object.
68: * @param array $config An array of settings to use for the cache engine.
69: * @return \Cake\Cache\CacheEngine The constructed CacheEngine class.
70: * @throws \RuntimeException when an object doesn't implement the correct interface.
71: */
72: protected function _create($class, $alias, $config)
73: {
74: if (is_object($class)) {
75: $instance = $class;
76: }
77:
78: unset($config['className']);
79: if (!isset($instance)) {
80: $instance = new $class($config);
81: }
82:
83: if (!($instance instanceof CacheEngine)) {
84: throw new RuntimeException(
85: 'Cache engines must use Cake\Cache\CacheEngine as a base class.'
86: );
87: }
88:
89: if (!$instance->init($config)) {
90: throw new RuntimeException(
91: sprintf('Cache engine %s is not properly configured.', get_class($instance))
92: );
93: }
94:
95: $config = $instance->getConfig();
96: if ($config['probability'] && time() % $config['probability'] === 0) {
97: $instance->gc();
98: }
99:
100: return $instance;
101: }
102:
103: /**
104: * Remove a single adapter from the registry.
105: *
106: * @param string $name The adapter name.
107: * @return void
108: */
109: public function unload($name)
110: {
111: unset($this->_loaded[$name]);
112: }
113: }
114: