<?php declare(strict_types=1);
namespace Shopware\Core\Checkout\Cart;
use Psr\Log\LoggerInterface;
use Shopware\Core\Content\Rule\RuleCollection;
use Shopware\Core\Framework\Context;
use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
class CachedRuleLoader extends AbstractRuleLoader
{
public const CACHE_KEY = 'cart_rules';
private AbstractRuleLoader $decorated;
private TagAwareAdapterInterface $cache;
private LoggerInterface $logger;
public function __construct(AbstractRuleLoader $decorated, TagAwareAdapterInterface $cache, LoggerInterface $logger)
{
$this->decorated = $decorated;
$this->cache = $cache;
$this->logger = $logger;
}
public function getDecorated(): AbstractRuleLoader
{
return $this->decorated;
}
public function load(Context $context): RuleCollection
{
$item = $this->cache->getItem(self::CACHE_KEY);
try {
if ($item->isHit() && $item->get()) {
$this->logger->info('cache-hit: ' . self::CACHE_KEY);
return $item->get();
}
} catch (\Throwable $e) {
$this->logger->error($e->getMessage());
}
$this->logger->info('cache-miss: ' . self::CACHE_KEY);
$rules = $this->getDecorated()->load($context);
$item->set($rules);
$this->cache->save($item);
return $rules;
}
}