Spaces:
No application file
No application file
| namespace Mautic\CoreBundle\Helper; | |
| use Doctrine\DBAL\Connection; | |
| use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter; | |
| use Symfony\Component\Cache\Adapter\FilesystemAdapter; | |
| /** | |
| * @deprecated This helper is deprecated in favor of CacheBundle | |
| */ | |
| class CacheStorageHelper | |
| { | |
| public const ADAPTOR_DATABASE = 'db'; | |
| public const ADAPTOR_FILESYSTEM = 'fs'; | |
| /** | |
| * @var array | |
| */ | |
| protected $cache = []; | |
| /** | |
| * @var DoctrineDbalAdapter|FilesystemAdapter | |
| */ | |
| protected $cacheAdaptor; | |
| protected string $cacheDir; | |
| /** | |
| * Semi BC support for pre 2.6.0. | |
| * | |
| * @deprecated 2.6.0 to be removed in 3.0 | |
| * | |
| * @var array | |
| */ | |
| protected $expirations = []; | |
| /** | |
| * @param mixed $cacheDir | |
| * @param mixed $namespace | |
| * @param int $defaultExpiration | |
| * @param string $adaptor | |
| */ | |
| public function __construct( | |
| protected $adaptor, | |
| protected $namespace = null, | |
| protected ?Connection $connection = null, | |
| $cacheDir = null, | |
| protected $defaultExpiration = 0 | |
| ) { | |
| $this->cacheDir = $cacheDir.'/data'; | |
| // @deprecated BC support for pre 2.6.0 to be removed in 3.0 | |
| if (!in_array($adaptor, [self::ADAPTOR_DATABASE, self::ADAPTOR_FILESYSTEM])) { | |
| if (file_exists($adaptor)) { | |
| $this->cacheDir = $adaptor.'/data'; | |
| } else { | |
| throw new \InvalidArgumentException('cache directory either not set or does not exist; use the container\'s mautic.helper.cache_storage service.'); | |
| } | |
| $this->adaptor = self::ADAPTOR_FILESYSTEM; | |
| } | |
| $this->setCacheAdaptor(); | |
| } | |
| public function getAdaptorClassName(): string | |
| { | |
| return $this->cacheAdaptor::class; | |
| } | |
| /** | |
| * @return bool | |
| * | |
| * @throws \Psr\Cache\InvalidArgumentException | |
| */ | |
| public function set($name, $data, $expiration = null) | |
| { | |
| $cacheItem = $this->cacheAdaptor->getItem($name); | |
| if (null !== $expiration) { | |
| $cacheItem->expiresAfter((int) $expiration); | |
| } elseif ($data === $cacheItem->get()) { | |
| // Exact same data so don't update the cache unless expiration is set | |
| return false; | |
| } | |
| $cacheItem->set($data); | |
| return $this->cacheAdaptor->save($cacheItem); | |
| } | |
| /** | |
| * @param int $maxAge @deprecated 2.6.0 to be removed in 3.0; set expiration when using set() | |
| * | |
| * @return bool|mixed | |
| * | |
| * @throws \Psr\Cache\InvalidArgumentException | |
| */ | |
| public function get($name, $maxAge = null) | |
| { | |
| if (0 === $maxAge) { | |
| return false; | |
| } elseif (null !== $maxAge) { | |
| } | |
| $cacheItem = $this->cacheAdaptor->getItem($name); | |
| if ($cacheItem->isHit()) { | |
| return $cacheItem->get(); | |
| } | |
| return false; | |
| } | |
| public function delete($name): void | |
| { | |
| $this->cacheAdaptor->deleteItem($name); | |
| } | |
| /** | |
| * @return bool | |
| */ | |
| public function has($name) | |
| { | |
| return $this->cacheAdaptor->hasItem($name); | |
| } | |
| /** | |
| * Wipes out the cache directory. | |
| */ | |
| public function clear(): void | |
| { | |
| $this->cacheAdaptor->clear(); | |
| } | |
| /** | |
| * @return CacheStorageHelper; | |
| */ | |
| public function getCache($namespace = null, $defaultExpiration = 0) | |
| { | |
| if (!$namespace) { | |
| return $this; | |
| } | |
| if (null === $defaultExpiration) { | |
| $defaultExpiration = $this->defaultExpiration; | |
| } | |
| if (!isset($this->cache[$namespace])) { | |
| $this->cache[$namespace] = new self($this->adaptor, $namespace, $this->connection, $this->cacheDir, (int) $defaultExpiration); | |
| } | |
| return $this->cache[$namespace]; | |
| } | |
| /** | |
| * Creates adapter. | |
| */ | |
| protected function setCacheAdaptor() | |
| { | |
| switch ($this->adaptor) { | |
| case self::ADAPTOR_DATABASE: | |
| $namespace = ($this->namespace) ? InputHelper::alphanum($this->namespace, false, '-', ['-', '+', '.']) : ''; | |
| $this->cacheAdaptor = new DoctrineDbalAdapter( | |
| $this->connection, $namespace, $this->defaultExpiration, ['db_table' => MAUTIC_TABLE_PREFIX.'cache_items'] | |
| ); | |
| break; | |
| case self::ADAPTOR_FILESYSTEM: | |
| $namespace = ($this->namespace) ? InputHelper::alphanum($this->namespace, false, '_', ['_', '-', '+', '.']) : ''; | |
| $this->cacheAdaptor = new FilesystemAdapter($namespace, $this->defaultExpiration, $this->cacheDir); | |
| break; | |
| default: | |
| throw new \InvalidArgumentException('Cache adaptor not supported.'); | |
| } | |
| } | |
| /** | |
| * Kept since it was public prior to deprecation. | |
| * | |
| * @deprecated 2.6.0 to be removed in 3.0 | |
| */ | |
| public function touchDir(): void | |
| { | |
| } | |
| } | |