diff --git a/src/Driver/ApcuDriver.php b/src/Driver/ApcuDriver.php index 352ce6a..85cbe13 100644 --- a/src/Driver/ApcuDriver.php +++ b/src/Driver/ApcuDriver.php @@ -86,7 +86,7 @@ class ApcuDriver extends AbstractDriver { * @param int $expires * @return bool */ - public function set(string $key, $value, int $expires = 0): bool + public function set(string $key, $value, ?int $expires = 0): bool { $ttl = $this->getTTLFromExpiration($expires); diff --git a/src/Driver/DriverInterface.php b/src/Driver/DriverInterface.php index cc0fab9..2adba47 100644 --- a/src/Driver/DriverInterface.php +++ b/src/Driver/DriverInterface.php @@ -36,7 +36,7 @@ interface DriverInterface { * @param int $expires * @return bool */ - public function set(string $key, $value, int $expires = 0): bool; + public function set(string $key, $value, ?int $expires = 0): bool; /** * Get the value for the selected cache key diff --git a/src/Driver/MemcachedDriver.php b/src/Driver/MemcachedDriver.php index 6a45e4f..07e8b19 100644 --- a/src/Driver/MemcachedDriver.php +++ b/src/Driver/MemcachedDriver.php @@ -121,7 +121,7 @@ class MemcachedDriver extends AbstractDriver { * @param int $expires * @return bool */ - public function set(string $key, $value, int $expires = 0): bool + public function set(string $key, $value, ?int $expires = 0): bool { return $this->conn->set($key, $value, $expires); } diff --git a/src/Driver/NullDriver.php b/src/Driver/NullDriver.php index 8541b0c..a5f99f5 100644 --- a/src/Driver/NullDriver.php +++ b/src/Driver/NullDriver.php @@ -72,7 +72,7 @@ class NullDriver extends AbstractDriver { * @param int $expires * @return bool */ - public function set(string $key, $value, int $expires = 0): bool + public function set(string $key, $value, ?int $expires = 0): bool { $this->store[$key] = $value; return $this->store[$key] === $value; diff --git a/src/Driver/RedisDriver.php b/src/Driver/RedisDriver.php index bd9631d..65bb3d3 100644 --- a/src/Driver/RedisDriver.php +++ b/src/Driver/RedisDriver.php @@ -88,7 +88,7 @@ class RedisDriver extends AbstractDriver { * @param int $expires * @return bool */ - public function set(string $key, $value, int $expires = 0): bool + public function set(string $key, $value, ?int $expires = 0): bool { $value = serialize($value); diff --git a/src/Teller.php b/src/Teller.php index c5c626c..111fefc 100644 --- a/src/Teller.php +++ b/src/Teller.php @@ -15,12 +15,16 @@ */ namespace Aviat\Banker; +use Aviat\Banker\Driver\DriverInterface; use Aviat\Banker\Exception\InvalidArgumentException; +use Psr\Log\LoggerAwareInterface; use Psr\SimpleCache; use Psr\Log\LoggerInterface; -class Teller implements SimpleCache\CacheInterface { - private Pool $pool; +class Teller implements SimpleCache\CacheInterface, LoggerAwareInterface { + use LoggerTrait; + + private DriverInterface $driver; /** * Set up the cache backend @@ -30,7 +34,12 @@ class Teller implements SimpleCache\CacheInterface { */ public function __construct(array $config, ?LoggerInterface $logger = NULL) { - $this->pool = new Pool($config, $logger); + $this->driver = $this->loadDriver($config); + + if ($logger !== NULL) + { + $this->setLogger($logger); + } } /** @@ -48,8 +57,7 @@ class Teller implements SimpleCache\CacheInterface { { $this->validateKey($key); - $item = $this->pool->getItem($key); - return ($item->isHit()) ? $item->get() : $default; + return ($this->driver->exists($key)) ? $this->driver->get($key) : $default; } /** @@ -70,15 +78,7 @@ class Teller implements SimpleCache\CacheInterface { { $this->validateKey($key); - $item = $this->pool->getItem($key); - $item->set($value); - - if ($ttl !== NULL) - { - $item->expiresAfter($ttl); - } - - return $this->pool->save($item); + return $this->driver->set($key, $value, $ttl); } /** @@ -95,7 +95,7 @@ class Teller implements SimpleCache\CacheInterface { { $this->validateKey($key); - return $this->pool->deleteItem($key); + return $this->driver->delete($key); } /** @@ -105,7 +105,7 @@ class Teller implements SimpleCache\CacheInterface { */ public function clear(): bool { - return $this->pool->clear(); + return $this->driver->flush(); } /** @@ -124,14 +124,7 @@ class Teller implements SimpleCache\CacheInterface { { $this->validateKeys($keys); - $output = []; - - foreach ($keys as $k) - { - $output[$k] = $this->get($k, $default); - } - - return $output; + return $this->driver->getMultiple((array)$keys); } /** @@ -177,7 +170,7 @@ class Teller implements SimpleCache\CacheInterface { { $this->validateKeys($keys); - return $this->pool->deleteItems((array)$keys); + return $this->driver->deleteMultiple((array)$keys); } /** @@ -199,7 +192,7 @@ class Teller implements SimpleCache\CacheInterface { { $this->validateKey($key); - return $this->pool->hasItem($key); + return $this->driver->exists($key); } /** @@ -237,4 +230,21 @@ class Teller implements SimpleCache\CacheInterface { throw new InvalidArgumentException('Invalid characters in cache key'); } } + + /** + * Instantiate the appropriate cache backend based on the config + * + * @param array $driverConfig + * @return DriverInterface + */ + protected function loadDriver(array $driverConfig = []): DriverInterface + { + $driver = ucfirst(strtolower($driverConfig['driver'] ?? 'null')); + $class = __NAMESPACE__ . "\\Driver\\${driver}Driver"; + + $driverConfig['connection'] = $driverConfig['connection'] ?? []; + $driverConfig['options'] = $driverConfig['options'] ?? []; + + return new $class($driverConfig['connection'], $driverConfig['options']); + } } \ No newline at end of file diff --git a/tests/TellerTest.php b/tests/TellerTest.php index b935786..e291349 100644 --- a/tests/TellerTest.php +++ b/tests/TellerTest.php @@ -15,9 +15,14 @@ */ namespace Aviat\Banker\Tests; +use Aviat\Banker\Pool; use Aviat\Banker\Teller; use Aviat\Banker\Exception\InvalidArgumentException; +use Monolog\Handler\SyslogHandler; +use Monolog\Logger; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; class TellerTest extends TestCase { @@ -51,6 +56,61 @@ class TellerTest extends TestCase { $this->teller->clear(); } + public function testGetDefaultLogger(): void + { + $friend = new Friend($this->teller); + $driverFriend = new Friend($friend->driver); + + // Check that a valid logger is set + $this->assertInstanceOf(LoggerInterface::class, $friend->getLogger(), "Logger exists after being set"); + $this->assertInstanceOf(LoggerInterface::class, $driverFriend->getLogger(), "Logger exists on driver after being set"); + + // Make sure we get the default Null logger + $this->assertTrue(is_a($friend->getLogger(), NullLogger::class)); + $this->assertTrue(is_a($driverFriend->getLogger(), NullLogger::class)); + } + + public function testSetLoggerInConstructor(): void + { + $logger = new Logger('test'); + $logger->pushHandler(new SyslogHandler('warning', LOG_USER, Logger::WARNING)); + + $teller = new Teller([ + 'driver' => 'null', + 'connection' => [], + ], $logger); + + $friend = new Friend($teller); + $driverFriend = new Friend($friend->driver); + + // Check that a valid logger is set + $this->assertInstanceOf(LoggerInterface::class, $friend->getLogger(), "Logger exists after being set"); + $this->assertInstanceOf(LoggerInterface::class, $driverFriend->getLogger(), "Logger exists on driver after being set"); + + // Make sure we aren't just getting the default Null logger + $this->assertFalse(is_a($friend->getLogger(), NullLogger::class)); + $this->assertFalse(is_a($driverFriend->getLogger(), NullLogger::class)); + } + + public function testGetSetLogger(): void + { + $logger = new Logger('test'); + $logger->pushHandler(new SyslogHandler('warning2',LOG_USER, Logger::WARNING)); + + $this->teller->setLogger($logger); + + $friend = new Friend($this->teller); + $driverFriend = new Friend($friend->driver); + + // Check that a valid logger is set + $this->assertInstanceOf(LoggerInterface::class, $friend->getLogger(), "Logger exists after being set"); + $this->assertInstanceOf(LoggerInterface::class, $driverFriend->getLogger(), "Logger exists on driver after being set"); + + // Make sure we aren't just getting the default Null logger + $this->assertFalse(is_a($friend->getLogger(), NullLogger::class)); + $this->assertFalse(is_a($driverFriend->getLogger(), NullLogger::class)); + } + public function testGetSet(): void { foreach ($this->testValues as $key => $value)