diff --git a/src/Cache/ClearableCacheInterface.php b/src/Cache/ClearableCacheInterface.php new file mode 100644 index 0000000..68c06ff --- /dev/null +++ b/src/Cache/ClearableCacheInterface.php @@ -0,0 +1,16 @@ + + */ +interface ClearableCacheInterface +{ + /** + * Clear all classes metadata from the cache. + */ + public function clear(): bool; +} diff --git a/src/Cache/DoctrineCacheAdapter.php b/src/Cache/DoctrineCacheAdapter.php index d3b069e..076ef09 100644 --- a/src/Cache/DoctrineCacheAdapter.php +++ b/src/Cache/DoctrineCacheAdapter.php @@ -10,7 +10,7 @@ /** * @author Henrik Bjornskov */ -class DoctrineCacheAdapter implements CacheInterface +class DoctrineCacheAdapter implements CacheInterface, ClearableCacheInterface { /** * @var string @@ -43,4 +43,13 @@ public function evict(string $class): void { $this->cache->delete($this->prefix . $class); } + + public function clear(): bool + { + if (method_exists($this->cache, 'deleteAll')) { // or $this->cache instanceof ClearableCache + return call_user_func([$this->cache, 'deleteAll']); + } + + return false; + } } diff --git a/src/Cache/FileCache.php b/src/Cache/FileCache.php index 3ea4af0..b07b94f 100644 --- a/src/Cache/FileCache.php +++ b/src/Cache/FileCache.php @@ -6,7 +6,7 @@ use Metadata\ClassMetadata; -class FileCache implements CacheInterface +class FileCache implements CacheInterface, ClearableCacheInterface { /** * @var string @@ -34,7 +34,6 @@ public function load(string $class): ?ClassMetadata if ($metadata instanceof ClassMetadata) { return $metadata; } - // if the file does not return anything, the return value is integer `1`. } catch (\ParseError $e) { // ignore corrupted cache @@ -106,6 +105,19 @@ public function evict(string $class): void } } + public function clear(): bool + { + $result = true; + $files = glob($this->dir . '/*.cache.php'); + foreach ($files as $file) { + if (is_file($file)) { + $result = $result && @unlink($file); + } + } + + return $result; + } + /** * This function computes the cache file path. * diff --git a/src/Cache/PsrCacheAdapter.php b/src/Cache/PsrCacheAdapter.php index 1d342ae..3a756fd 100644 --- a/src/Cache/PsrCacheAdapter.php +++ b/src/Cache/PsrCacheAdapter.php @@ -7,7 +7,7 @@ use Metadata\ClassMetadata; use Psr\Cache\CacheItemPoolInterface; -class PsrCacheAdapter implements CacheInterface +class PsrCacheAdapter implements CacheInterface, ClearableCacheInterface { /** * @var string @@ -53,6 +53,11 @@ public function evict(string $class): void $this->pool->deleteItem($this->sanitizeCacheKey($this->prefix . $class)); } + public function clear(): bool + { + return $this->pool->clear(); + } + /** * If anonymous class is to be cached, it contains invalid path characters that need to be removed/replaced * Example of anonymous class name: class@anonymous\x00/app/src/Controller/DefaultController.php0x7f82a7e026ec diff --git a/tests/Cache/DoctrineCacheAdapterTest.php b/tests/Cache/DoctrineCacheAdapterTest.php index 21a374e..70985d7 100644 --- a/tests/Cache/DoctrineCacheAdapterTest.php +++ b/tests/Cache/DoctrineCacheAdapterTest.php @@ -7,6 +7,8 @@ use Doctrine\Common\Cache\ArrayCache; use Metadata\Cache\DoctrineCacheAdapter; use Metadata\ClassMetadata; +use Metadata\Tests\Driver\Fixture\A\A; +use Metadata\Tests\Driver\Fixture\B\B; use Metadata\Tests\Fixtures\TestObject; use PHPUnit\Framework\TestCase; @@ -50,4 +52,19 @@ public function classNameProvider() ], ]; } + + public function testClear(): void + { + $cache = new ArrayCache(); + $cacheAdapter = new DoctrineCacheAdapter('', $cache); + + $cacheAdapter->put(new ClassMetadata(A::class)); + $cacheAdapter->put(new ClassMetadata(B::class)); + self::assertTrue($cache->contains(A::class)); + self::assertTrue($cache->contains(B::class)); + + self::assertTrue($cacheAdapter->clear()); + self::assertFalse($cache->contains(A::class)); + self::assertFalse($cache->contains(B::class)); + } } diff --git a/tests/Cache/FileCacheTest.php b/tests/Cache/FileCacheTest.php index aab6c5f..2698800 100644 --- a/tests/Cache/FileCacheTest.php +++ b/tests/Cache/FileCacheTest.php @@ -6,6 +6,8 @@ use Metadata\Cache\FileCache; use Metadata\ClassMetadata; +use Metadata\Tests\Driver\Fixture\A\A; +use Metadata\Tests\Driver\Fixture\B\B; use Metadata\Tests\Fixtures\TestObject; use org\bovigo\vfs\vfsStream; use PHPUnit\Framework\TestCase; @@ -52,7 +54,7 @@ public function testLoadEvictPutClassMetadataFromInCache(string $className) public function classNameProvider() { return [ - 'TestObject' => [TestObject::class], + 'TestObject' => [TestObject::class], 'anonymous class' => [ get_class(new class { }), @@ -106,4 +108,17 @@ public function testThrowExceptionIfCacheFilePathNotWritable() $cache->put($metadata = new ClassMetadata('Metadata\Tests\Fixtures\TestParent')); } + + public function testClear(): void + { + self::assertCount(0, glob($this->dir . '/*')); + $cache = new FileCache($this->dir); + + $cache->put(new ClassMetadata(A::class)); + $cache->put(new ClassMetadata(B::class)); + self::assertCount(2, glob($this->dir . '/*')); + + self::assertTrue($cache->clear()); + self::assertCount(0, glob($this->dir . '/*')); + } } diff --git a/tests/Cache/PsrCacheAdapterTest.php b/tests/Cache/PsrCacheAdapterTest.php index 874ffc9..1142fab 100644 --- a/tests/Cache/PsrCacheAdapterTest.php +++ b/tests/Cache/PsrCacheAdapterTest.php @@ -6,6 +6,8 @@ use Metadata\Cache\PsrCacheAdapter; use Metadata\ClassMetadata; +use Metadata\Tests\Driver\Fixture\A\A; +use Metadata\Tests\Driver\Fixture\B\B; use Metadata\Tests\Fixtures\TestObject; use PHPUnit\Framework\TestCase; use Symfony\Component\Cache\Adapter\ArrayAdapter; @@ -51,4 +53,19 @@ public function classNameProvider() ], ]; } + + public function testClear(): void + { + $pool = new ArrayAdapter(); + $cacheAdapter = new PsrCacheAdapter('metadata-test', $pool); + + $cacheAdapter->put(new ClassMetadata(A::class)); + $cacheAdapter->put(new ClassMetadata(B::class)); + self::assertTrue($pool->hasItem('metadata-testMetadata-Tests-Driver-Fixture-A-A')); + self::assertTrue($pool->hasItem('metadata-testMetadata-Tests-Driver-Fixture-B-B')); + + self::assertTrue($cacheAdapter->clear()); + self::assertFalse($pool->hasItem('metadata-testMetadata-Tests-Driver-Fixture-A-A')); + self::assertFalse($pool->hasItem('metadata-testMetadata-Tests-Driver-Fixture-B-B')); + } }