Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
9 / 9
CRAP
100.00% covered (success)
100.00%
28 / 28
Teller
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
9 / 9
14
100.00% covered (success)
100.00%
28 / 28
 __construct
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 clear
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 get
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
2 / 2
 set
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 delete
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getMultiple
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
10 / 10
 setMultiple
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 deleteMultiple
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 has
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
1<?php declare(strict_types=1);
2/**
3 * Banker
4 *
5 * A Caching library implementing psr/cache (PSR 6) and psr/simple-cache (PSR 16)
6 *
7 * PHP version 8+
8 *
9 * @package     Banker
10 * @author      Timothy J. Warren <tim@timshomepage.net>
11 * @copyright   2016 - 2021  Timothy J. Warren
12 * @license     http://www.opensource.org/licenses/mit-license.html  MIT License
13 * @version     5.0.0
14 * @link        https://git.timshomepage.net/timw4mail/banker
15 */
16namespace Aviat\Banker;
17
18use DateInterval;
19use Psr\Log\{LoggerInterface, LoggerAwareInterface};
20use Psr\SimpleCache;
21
22/**
23 * Implements PSR-16 (SimpleCache)
24 */
25class Teller implements LoggerAwareInterface, SimpleCache\CacheInterface {
26    use _Driver;
27    use LoggerTrait;
28
29    /**
30     * Set up the cache backend
31     *
32     * @param array $config
33     * @param LoggerInterface|null $logger
34     */
35    public function __construct(array $config, ?LoggerInterface $logger = NULL)
36    {
37        $this->driver = $this->loadDriver($config);
38
39        if ($logger !== NULL)
40        {
41            $this->setLogger($logger);
42        }
43    }
44
45    /**
46     * Wipes clean the entire cache's keys.
47     *
48     * @return bool True on success and false on failure.
49     */
50    public function clear(): bool
51    {
52        return $this->driver->flush();
53    }
54
55    /**
56     * Fetches a value from the cache.
57     *
58     * @param string $key     The unique key of this item in the cache.
59     * @param mixed  $default Default value to return if the key does not exist.
60     *
61     * @return mixed The value of the item from the cache, or $default in case of cache miss.
62     *
63     * @throws SimpleCache\InvalidArgumentException
64     *   MUST be thrown if the $key string is not a legal value.
65     */
66    public function get(string $key, mixed $default = null): mixed
67    {
68        $this->validateKey($key);
69
70        return ($this->driver->exists($key)) ? $this->driver->get($key) : $default;
71    }
72
73    /**
74     * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time.
75     *
76     * @param string                 $key   The key of the item to store.
77     * @param mixed                  $value The value of the item to store, must be serializable.
78     * @param null|int|DateInterval $ttl   Optional. The TTL value of this item. If no value is sent and
79     *                                      the driver supports TTL then the library may set a default value
80     *                                      for it or let the driver take care of that.
81     *
82     * @return bool True on success and false on failure.
83     *
84     * @throws SimpleCache\InvalidArgumentException
85     *   MUST be thrown if the $key string is not a legal value.
86     */
87    public function set(string $key, mixed $value, null|int|DateInterval $ttl = null): bool
88    {
89        $this->validateKey($key);
90
91        return $this->driver->set($key, $value, $ttl);
92    }
93
94    /**
95     * Delete an item from the cache by its unique key.
96     *
97     * @param string $key The unique cache key of the item to delete.
98     *
99     * @return bool True if the item was successfully removed. False if there was an error.
100     *
101     * @throws SimpleCache\InvalidArgumentException
102     *   MUST be thrown if the $key string is not a legal value.
103     */
104    public function delete(string $key): bool
105    {
106        $this->validateKey($key);
107
108        return $this->driver->delete($key);
109    }
110
111    /**
112     * Obtains multiple cache items by their unique keys.
113     *
114     * @param iterable $keys    A list of keys that can obtained in a single operation.
115     * @param mixed    $default Default value to return for keys that do not exist.
116     *
117     * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value.
118     *
119     * @throws SimpleCache\InvalidArgumentException
120     *   MUST be thrown if $keys is neither an array nor a Traversable,
121     *   or if any of the $keys are not a legal value.
122     */
123    public function getMultiple(iterable $keys, mixed $default = null): iterable
124    {
125        $keys = (array)$keys;
126        $this->validateKeys($keys);
127        $foundValues = $this->driver->getMultiple($keys);
128        $foundKeys = array_keys($foundValues);
129
130        // If all the values are found, just return them
131        if ($keys === $foundKeys)
132        {
133            return $foundValues;
134        }
135
136        // Otherwise, return a default value for missing keys
137        $result = $foundValues;
138        foreach (array_diff($keys, $foundKeys) as $key)
139        {
140            $result[$key] = $default;
141        }
142
143        return $result;
144    }
145
146    /**
147     * Persists a set of key => value pairs in the cache, with an optional TTL.
148     *
149     * @param iterable               $values A list of key => value pairs for a multiple-set operation.
150     * @param null|int|DateInterval $ttl    Optional. The TTL value of this item. If no value is sent and
151     *                                       the driver supports TTL then the library may set a default value
152     *                                       for it or let the driver take care of that.
153     *
154     * @return bool True on success and false on failure.
155     *
156     * @throws SimpleCache\InvalidArgumentException
157     *   MUST be thrown if $values is neither an array nor a Traversable,
158     *   or if any of the $values are not a legal value.
159     */
160    public function setMultiple(iterable $values, null|int|DateInterval $ttl = null): bool
161    {
162        $this->validateKeys($values, TRUE);
163
164        return ($ttl === NULL)
165            ? $this->driver->setMultiple((array)$values)
166            : $this->driver->setMultiple((array)$values, $ttl);
167    }
168
169    /**
170     * Deletes multiple cache items in a single operation.
171     *
172     * @param iterable $keys A list of string-based keys to be deleted.
173     *
174     * @return bool True if the items were successfully removed. False if there was an error.
175     *
176     * @throws SimpleCache\InvalidArgumentException
177     *   MUST be thrown if $keys is neither an array nor a Traversable,
178     *   or if any of the $keys are not a legal value.
179     */
180    public function deleteMultiple(iterable $keys): bool
181    {
182        $this->validateKeys($keys);
183
184        return $this->driver->deleteMultiple((array)$keys);
185    }
186
187    /**
188     * Determines whether an item is present in the cache.
189     *
190     * NOTE: It is recommended that has() is only to be used for cache warming type purposes
191     * and not to be used within your live applications operations for get/set, as this method
192     * is subject to a race condition where your has() will return true and immediately after,
193     * another script can remove it making the state of your app out of date.
194     *
195     * @param string $key The cache item key.
196     *
197     * @return bool
198     *
199     * @throws SimpleCache\InvalidArgumentException
200     *   MUST be thrown if the $key string is not a legal value.
201     */
202    public function has(string $key): bool
203    {
204        $this->validateKey($key);
205
206        return $this->driver->exists($key);
207    }
208}