Passed
Push — master ( 3bdf73...c101c0 )
by Michael
31s
created

CachedConfigCollection::getHistory()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace micmania1\config;
4
5
use Psr\Cache\CacheItemPoolInterface;
6
7
class CachedConfigCollection implements ConfigCollectionInterface
8
{
9
    /**
10
     * @const string
11
     */
12
    const METADATA_KEY = '__METADATA__';
13
14
    /**
15
     * @const string
16
     */
17
    const HISTORY_KEY = '__HISTORY__';
18
19
    /**
20
     * @var CacheItemPoolInterface
21
     */
22
    protected $pool;
23
24
    /**
25
     * @var boolean
26
     */
27
    protected $trackMetadata = false;
28
29
    /**
30
     * @param boolean $trackMetadata
31
     * @param CacheItemPoolInterface $pool
32
     */
33 3
    public function __construct(CacheItemPoolInterface $pool, $trackMetadata = false)
34
    {
35 3
        $this->pool = $pool;
36 3
        $this->trackMetadata = (bool) $trackMetadata;
37 3
    }
38
39
    /**
40
     * {@inheritdoc}
41
     */
42 3
    public function set($key, $value, $metadata = [])
43
    {
44
        // We use null as the key to return an empty cache item
45 3
        $cacheItem = $this->pool->getItem($key);
46
47 3
        if($this->trackMetadata) {
48 1
            $cachedMetadata = $this->getMetadata();
49 1
            $cachedHistory = $this->getHistory();
50
51 1
            if($this->exists($key) && isset($metadata[$key])) {
52
                array_unshift($cachedHistory, [
53
                    'value' => $value,
54
                    'metadata' => $metadata,
55
                ]);
56
            }
57
58 1
            $cachedMetadata[$key] = $metadata;
59
60 1
            $this->saveMetadata($cachedMetadata);
61 1
            $this->saveHistory($cachedHistory);
62 1
        }
63
64
        // Save our new value
65 3
        $cacheItem->set($value);
66 3
        $this->pool->saveDeferred($cacheItem);
67 3
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72 1
    public function get($key)
73
    {
74 1
        if(!$this->exists($key)) {
75 1
            return null;
76
        }
77
78 1
        $cacheItem = $this->pool->getItem($key);
79
80 1
        return $cacheItem->get() ?: null;
81
    }
82
83
    /**
84
     * {@inheritdoc}
85
     */
86 2
    public function exists($key)
87
    {
88 2
        return $this->pool->hasItem($key);
89
    }
90
91
    /**
92
     * {@inheritdoc}
93
     */
94 1
    public function delete($key)
95
    {
96 1
        $this->pool->deleteItem($key);
97 1
    }
98
99
    /**
100
     * {@inheritdoc}
101
     */
102 2
    public function getMetadata()
103
    {
104 2
        return $this->getTrackingData(self::METADATA_KEY);
105
    }
106
107
    /**
108
     * {@inheritdoc}
109
     */
110 2
    public function getHistory()
111
    {
112 2
        return $this->getTrackingData(self::HISTORY_KEY);
113
    }
114
115
    /**
116
     * A shortcut for tracking data (metadata and history). This will
117
     * always return an array, even if we're not tracking.
118
     *
119
     * @param string $key
120
     *
121
     * @return array
122
     */
123 2
    private function getTrackingData($key)
124
    {
125 2
        if (!$this->trackMetadata) {
126 1
            return [];
127
        }
128
129 1
        $value = $this->pool->getItem($key)->get();
130
131 1
        return is_array($value) ? $value : [];
132
    }
133
134
    /**
135
     * Saves the metadata to cache
136
     *
137
     * @param array $metadata
138
     */
139 1
    protected function saveMetadata($metadata)
140
    {
141 1
        $cached = $this->pool->getItem(self::METADATA_KEY);
142 1
        $cached->set($metadata);
143
144 1
        $this->pool->saveDeferred($cached);
145 1
    }
146
147
    /**
148
     * Saves the history to the cache
149
     *
150
     * @param array $history
151
     */
152 1
    protected function saveHistory($history)
153
    {
154 1
        $cached = $this->pool->getItem(self::HISTORY_KEY);
155 1
        $cached->set($history);
156
157 1
        $this->pool->saveDeferred($cached);
158 1
    }
159
160
    /**
161
     * Commits the cache
162
     */
163 3
    public function __destruct()
164
    {
165 3
        $this->pool->commit();
166 3
    }
167
}
168