Provide PSR array cache and switch annotation reader to it

The annotation reader was using CachedReader which has been deprecated so we need to switch to PsrCachedReader
Since 2.0 doctrine/cache no longer provides implementations of caches so I also needed to implement a simple PSR array cache.
[MAILPOET-3892]
This commit is contained in:
Rostislav Wolny
2021-10-26 15:35:05 +02:00
committed by Veljko V
parent 503283fa63
commit 86e938b46e
2 changed files with 94 additions and 7 deletions

View File

@@ -2,29 +2,28 @@
namespace MailPoet\Doctrine\Annotations;
use MailPoet\Doctrine\PSRArrayCache;
use MailPoetVendor\Doctrine\Common\Annotations\AnnotationReader;
use MailPoetVendor\Doctrine\Common\Annotations\AnnotationRegistry;
use MailPoetVendor\Doctrine\Common\Annotations\CachedReader;
use MailPoetVendor\Doctrine\Common\Cache\ArrayCache;
use MailPoetVendor\Doctrine\Common\Annotations\PsrCachedReader;
class AnnotationReaderProvider {
/** @var CachedReader */
/** @var PsrCachedReader */
private $annotationReader;
public function __construct() {
// register annotation reader if doctrine/annotations package is installed
// (i.e. in dev environment, on production metadata is dumped in the build)
$readAnnotations = class_exists(CachedReader::class) && class_exists(AnnotationReader::class);
$readAnnotations = class_exists(PsrCachedReader::class) && class_exists(AnnotationReader::class);
if ($readAnnotations) {
// autoload all annotation classes using registered loaders (Composer)
// (needed for Symfony\Validator constraint annotations to be loaded)
AnnotationRegistry::registerLoader('class_exists');
$this->annotationReader = new CachedReader(new AnnotationReader(), new ArrayCache());
$this->annotationReader = new PsrCachedReader(new AnnotationReader(), new PSRArrayCache());
}
}
/** @return CachedReader|null */
public function getAnnotationReader() {
public function getAnnotationReader(): ?PsrCachedReader {
return $this->annotationReader;
}
}

View File

@@ -0,0 +1,88 @@
<?php
namespace MailPoet\Doctrine;
use MailPoetVendor\Psr\Cache\CacheItemInterface;
use MailPoetVendor\Psr\Cache\CacheItemPoolInterface;
class PSRArrayCache implements CacheItemPoolInterface {
/** @var mixed[] */
private $cache = [];
/**
* @inheritDoc
*/
public function getItem($key) {
if (!is_string($key)) {
throw new PSRCacheInvalidArgumentException('Invalid key');
}
if (!$this->hasItem($key)) {
return new PSRCacheItem($key, false);
}
return new PSRCacheItem($key, $this->cache[$key]);
}
public function getItems(array $keys = []) {
return array_map([$this, 'getItem'], $keys);
}
/**
* @inheritDoc
*/
public function hasItem($key) {
return array_key_exists($key, $this->cache);
}
/**
* @inheritDoc
*/
public function clear() {
$this->cache = [];
return true;
}
/**
* @inheritDoc
*/
public function deleteItem($key) {
if (!is_string($key)) {
throw new PSRCacheInvalidArgumentException('Invalid key');
}
unset($this->cache[$key]);
return true;
}
/**
* @inheritDoc
*/
public function deleteItems(array $keys) {
try {
array_map([$this, 'deleteItem'], $keys);
} catch (PSRCacheInvalidArgumentException $e) {
return false;
}
return true;
}
/**
* @inheritDoc
*/
public function save(CacheItemInterface $item) {
$this->cache[$item->getKey()] = $item->get();
return true;
}
/**
* @inheritDoc
*/
public function saveDeferred(CacheItemInterface $item) {
return $this->save($item);
}
/**
* @inheritDoc
*/
public function commit() {
return true;
}
}