1
|
|
|
<?php |
2
|
|
|
namespace Suven\FlintRedis; |
3
|
|
|
|
4
|
|
|
abstract class FlintRedisCacheFactory |
5
|
|
|
{ |
6
|
|
|
const STRATEGY_REDIS = 1; |
7
|
|
|
const STRATEGY_FLINTSTONE = 2; |
8
|
|
|
|
9
|
|
|
private static $cachedInstances = []; |
10
|
|
|
|
11
|
15 |
|
private static function getKey($realm, $strategy) |
12
|
|
|
{ |
13
|
15 |
|
return "${realm}.${strategy}"; |
14
|
|
|
} |
15
|
|
|
|
16
|
|
|
private static function getFullKey($key, $options) |
17
|
|
|
{ |
18
|
15 |
|
$optionsKey = md5(json_encode($options)); |
19
|
15 |
|
return "${key}.${optionsKey}"; |
20
|
|
|
} |
21
|
|
|
|
22
|
|
|
/** |
23
|
|
|
* Retrieves a new or previously created cache-instance for the provided |
24
|
|
|
* parameters. |
25
|
|
|
* |
26
|
|
|
* If you previously created an instance for a collection 'foo' with a |
27
|
|
|
* strategy [and options] and are later 'creating' in instance but only |
28
|
|
|
* provide the realm 'foo', you will retreive your previously created instance. |
29
|
|
|
* |
30
|
|
|
* That way you only have to provide the strategy and options once per $realm. |
31
|
|
|
* |
32
|
|
|
* @param string $realm Your collections name |
33
|
|
|
* @param number $strategy Either FlintRedisCacheFactory::STRATEGY_REDIS |
34
|
|
|
* or FlintRedisCacheFactory:: STRATEGY_FLINTSTONE |
35
|
|
|
* @param array $options Options you want to pass to predis/flintstone |
36
|
|
|
* @return FlintRedisCache |
37
|
|
|
*/ |
38
|
|
|
public static function create($realm, $strategy = false, $options = false) |
39
|
|
|
{ |
40
|
15 |
|
$instance = self::retrieveOldInstance($strategy, $realm, $options); |
41
|
|
|
|
42
|
15 |
|
if (!$instance) { |
43
|
15 |
|
$instance = self::newCacheInstance($strategy, $realm, $options); |
44
|
10 |
|
} |
45
|
|
|
|
46
|
15 |
|
return $instance; |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
private static function retrieveOldInstance($strategy, $realm, $options) |
50
|
|
|
{ |
51
|
15 |
|
$key = self::getKey($realm, $strategy); |
52
|
15 |
|
$fullKey = self::getFullKey($key, $options); |
53
|
|
|
|
54
|
15 |
|
$instance = false; |
55
|
|
|
|
56
|
15 |
View Code Duplication |
if ($strategy && $options && isset(self::$cachedInstances[$fullKey])) { |
|
|
|
|
57
|
3 |
|
$instance = self::$cachedInstances[$fullKey]; |
58
|
2 |
|
} |
59
|
|
|
|
60
|
15 |
View Code Duplication |
if ($strategy && !$options && isset(self::$cachedInstances[$key])) { |
|
|
|
|
61
|
6 |
|
$instance = self::$cachedInstances[$key]; |
62
|
4 |
|
} |
63
|
|
|
|
64
|
15 |
View Code Duplication |
if (!$strategy && !$options && isset(self::$cachedInstances[$realm])) { |
|
|
|
|
65
|
9 |
|
$instance = self::$cachedInstances[$realm]; |
66
|
6 |
|
} |
67
|
|
|
|
68
|
15 |
|
return $instance; |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
private static function newCacheInstance($strategy, $realm, $options) |
72
|
|
|
{ |
73
|
15 |
|
$strategy = $strategy ? $strategy : self::STRATEGY_REDIS; |
74
|
15 |
|
$options = $options ? $options : []; |
75
|
|
|
|
76
|
15 |
|
$key = self::getKey($realm, $strategy); |
77
|
15 |
|
$fullKey = self::getFullKey($key, $options); |
78
|
|
|
|
79
|
|
|
$instance; |
|
|
|
|
80
|
|
|
|
81
|
15 |
|
if ($strategy === self::STRATEGY_REDIS) { |
82
|
15 |
|
$instance = new FlintRedisCacheRedis($realm, $options); |
83
|
10 |
|
} else { |
84
|
12 |
|
$instance = new FlintRedisCacheFlintstone($realm, $options); |
85
|
|
|
} |
86
|
|
|
|
87
|
15 |
|
self::$cachedInstances[$fullKey] = &$instance; |
88
|
15 |
|
self::$cachedInstances[$key] = &$instance; |
89
|
15 |
|
self::$cachedInstances[$realm] = &$instance; |
90
|
|
|
|
91
|
15 |
|
return $instance; |
92
|
|
|
} |
93
|
|
|
} |
94
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.