123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\Interception\Config;
- use Magento\Framework\Serialize\SerializerInterface;
- /**
- * Interception config.
- *
- * Responsible for providing list of plugins configured for instance
- */
- class Config implements \Magento\Framework\Interception\ConfigInterface
- {
- /**
- * Type configuration
- *
- * @var \Magento\Framework\Interception\ObjectManager\ConfigInterface
- */
- protected $_omConfig;
- /**
- * Class relations info
- *
- * @var \Magento\Framework\ObjectManager\RelationsInterface
- */
- protected $_relations;
- /**
- * List of interceptable classes
- *
- * @var \Magento\Framework\ObjectManager\DefinitionInterface
- */
- protected $_classDefinitions;
- /**
- * Cache
- * @deprecated 102.0.1
- * @var \Magento\Framework\Cache\FrontendInterface
- */
- protected $_cache;
- /**
- * Cache identifier
- *
- * @var string
- */
- protected $_cacheId;
- /**
- * Configuration reader
- *
- * @var \Magento\Framework\Config\ReaderInterface
- */
- protected $_reader;
- /**
- * Inherited list of intercepted types
- *
- * @var array
- */
- protected $_intercepted = [];
- /**
- * List of class types that can not be pluginized
- *
- * @var array
- */
- protected $_serviceClassTypes = ['Interceptor'];
- /**
- * @var \Magento\Framework\Config\ScopeListInterface
- */
- protected $_scopeList;
- /**
- * @var CacheManager
- */
- private $cacheManager;
- /**
- * Config constructor
- *
- * @param \Magento\Framework\Config\ReaderInterface $reader
- * @param \Magento\Framework\Config\ScopeListInterface $scopeList
- * @param \Magento\Framework\Cache\FrontendInterface $cache @deprecated
- * @param \Magento\Framework\ObjectManager\RelationsInterface $relations
- * @param \Magento\Framework\Interception\ObjectManager\ConfigInterface $omConfig
- * @param \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions
- * @param string $cacheId
- * @param SerializerInterface|null $serializer @deprecated
- * @param CacheManager $cacheManager
- *
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function __construct(
- \Magento\Framework\Config\ReaderInterface $reader,
- \Magento\Framework\Config\ScopeListInterface $scopeList,
- \Magento\Framework\Cache\FrontendInterface $cache,
- \Magento\Framework\ObjectManager\RelationsInterface $relations,
- \Magento\Framework\Interception\ObjectManager\ConfigInterface $omConfig,
- \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions,
- $cacheId = 'interception',
- SerializerInterface $serializer = null,
- CacheManager $cacheManager = null
- ) {
- $this->_omConfig = $omConfig;
- $this->_relations = $relations;
- $this->_classDefinitions = $classDefinitions;
- $this->_cache = $cache;
- $this->_cacheId = $cacheId;
- $this->_reader = $reader;
- $this->_scopeList = $scopeList;
- $this->cacheManager =
- $cacheManager ?? \Magento\Framework\App\ObjectManager::getInstance()->get(CacheManager::class);
- $intercepted = $this->cacheManager->load($cacheId);
- if ($intercepted !== null) {
- $this->_intercepted = $intercepted;
- } else {
- $this->initializeUncompiled($this->_classDefinitions->getClasses());
- }
- }
- /**
- * Initialize interception config
- *
- * @param array $classDefinitions
- * @return void
- */
- public function initialize($classDefinitions = [])
- {
- $this->generateIntercepted($classDefinitions);
- $this->cacheManager->saveCompiled($this->_cacheId, $this->_intercepted);
- }
- /**
- * Process interception inheritance
- *
- * @param string $type
- * @return bool
- */
- protected function _inheritInterception($type)
- {
- $type = ltrim($type, '\\');
- if (!isset($this->_intercepted[$type])) {
- $realType = $this->_omConfig->getOriginalInstanceType($type);
- if ($type !== $realType) {
- if ($this->_inheritInterception($realType)) {
- $this->_intercepted[$type] = true;
- return true;
- }
- } else {
- $parts = explode('\\', $type);
- if (!in_array(end($parts), $this->_serviceClassTypes) && $this->_relations->has($type)) {
- $relations = $this->_relations->getParents($type);
- foreach ($relations as $relation) {
- if ($relation && $this->_inheritInterception($relation)) {
- $this->_intercepted[$type] = true;
- return true;
- }
- }
- }
- }
- $this->_intercepted[$type] = false;
- }
- return $this->_intercepted[$type];
- }
- /**
- * @inheritdoc
- */
- public function hasPlugins($type)
- {
- if (isset($this->_intercepted[$type])) {
- return $this->_intercepted[$type];
- }
- return $this->_inheritInterception($type);
- }
- /**
- * Write interception config to cache
- *
- * @param array $classDefinitions
- */
- private function initializeUncompiled($classDefinitions = [])
- {
- $this->cacheManager->clean($this->_cacheId);
- $this->generateIntercepted($classDefinitions);
- $this->cacheManager->save($this->_cacheId, $this->_intercepted);
- }
- /**
- * Generate intercepted array to store in compiled metadata or frontend cache
- *
- * @param array $classDefinitions
- */
- private function generateIntercepted($classDefinitions)
- {
- $config = [];
- foreach ($this->_scopeList->getAllScopes() as $scope) {
- $config = array_replace_recursive($config, $this->_reader->read($scope));
- }
- unset($config['preferences']);
- foreach ($config as $typeName => $typeConfig) {
- if (!empty($typeConfig['plugins'])) {
- $this->_intercepted[ltrim($typeName, '\\')] = true;
- }
- }
- foreach ($config as $typeName => $typeConfig) {
- $this->hasPlugins($typeName);
- }
- foreach ($classDefinitions as $class) {
- $this->hasPlugins($class);
- }
- }
- }
|