123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Model\Metadata;
- use Magento\Config\App\Config\Type\System;
- use Magento\Customer\Api\Data\AttributeMetadataInterface;
- use Magento\Eav\Model\Cache\Type;
- use Magento\Eav\Model\Entity\Attribute;
- use Magento\Framework\App\Cache\StateInterface;
- use Magento\Framework\App\CacheInterface;
- use Magento\Framework\Serialize\SerializerInterface;
- use Magento\Store\Model\StoreManagerInterface;
- /**
- * Cache for attribute metadata
- */
- class AttributeMetadataCache
- {
- /**
- * Cache prefix
- */
- const ATTRIBUTE_METADATA_CACHE_PREFIX = 'ATTRIBUTE_METADATA_INSTANCES_CACHE';
- /**
- * @var CacheInterface
- */
- private $cache;
- /**
- * @var StateInterface
- */
- private $state;
- /**
- * @var AttributeMetadataInterface[]
- */
- private $attributes;
- /**
- * @var bool
- */
- private $isAttributeCacheEnabled;
- /**
- * @var AttributeMetadataHydrator
- */
- private $attributeMetadataHydrator;
- /**
- * @var SerializerInterface
- */
- private $serializer;
- /**
- * @var StoreManagerInterface
- */
- private $storeManager;
- /**
- * Constructor
- *
- * @param CacheInterface $cache
- * @param StateInterface $state
- * @param SerializerInterface $serializer
- * @param AttributeMetadataHydrator $attributeMetadataHydrator
- * @param StoreManagerInterface $storeManager
- */
- public function __construct(
- CacheInterface $cache,
- StateInterface $state,
- SerializerInterface $serializer,
- AttributeMetadataHydrator $attributeMetadataHydrator,
- StoreManagerInterface $storeManager = null
- ) {
- $this->cache = $cache;
- $this->state = $state;
- $this->serializer = $serializer;
- $this->attributeMetadataHydrator = $attributeMetadataHydrator;
- $this->storeManager = $storeManager ?: \Magento\Framework\App\ObjectManager::getInstance()
- ->get(StoreManagerInterface::class);
- }
- /**
- * Load attributes metadata from cache
- *
- * @param string $entityType
- * @param string $suffix
- * @return AttributeMetadataInterface[]|bool
- */
- public function load($entityType, $suffix = '')
- {
- $storeId = $this->storeManager->getStore()->getId();
- if (isset($this->attributes[$entityType . $suffix . $storeId])) {
- return $this->attributes[$entityType . $suffix . $storeId];
- }
- if ($this->isEnabled()) {
- $cacheKey = self::ATTRIBUTE_METADATA_CACHE_PREFIX . $entityType . $suffix . $storeId;
- $serializedData = $this->cache->load($cacheKey);
- if ($serializedData) {
- $attributesData = $this->serializer->unserialize($serializedData);
- $attributes = [];
- foreach ($attributesData as $key => $attributeData) {
- $attributes[$key] = $this->attributeMetadataHydrator->hydrate($attributeData);
- }
- $this->attributes[$entityType . $suffix . $storeId] = $attributes;
- return $attributes;
- }
- }
- return false;
- }
- /**
- * Save attributes metadata to cache
- *
- * @param string $entityType
- * @param AttributeMetadataInterface[] $attributes
- * @param string $suffix
- * @return void
- */
- public function save($entityType, array $attributes, $suffix = '')
- {
- $storeId = $this->storeManager->getStore()->getId();
- $this->attributes[$entityType . $suffix . $storeId] = $attributes;
- if ($this->isEnabled()) {
- $cacheKey = self::ATTRIBUTE_METADATA_CACHE_PREFIX . $entityType . $suffix . $storeId;
- $attributesData = [];
- foreach ($attributes as $key => $attribute) {
- $attributesData[$key] = $this->attributeMetadataHydrator->extract($attribute);
- }
- $serializedData = $this->serializer->serialize($attributesData);
- $this->cache->save(
- $serializedData,
- $cacheKey,
- [
- Type::CACHE_TAG,
- Attribute::CACHE_TAG,
- System::CACHE_TAG
- ]
- );
- }
- }
- /**
- * Clean attributes metadata cache
- *
- * @return void
- */
- public function clean()
- {
- unset($this->attributes);
- if ($this->isEnabled()) {
- $this->cache->clean(
- [
- Type::CACHE_TAG,
- Attribute::CACHE_TAG,
- ]
- );
- }
- }
- /**
- * Check if cache enabled
- *
- * @return bool
- */
- private function isEnabled()
- {
- if (null === $this->isAttributeCacheEnabled) {
- $this->isAttributeCacheEnabled = $this->state->isEnabled(Type::TYPE_IDENTIFIER);
- }
- return $this->isAttributeCacheEnabled;
- }
- }
|