Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
InterceptionConfigurationBuilder.php
Go to the documentation of this file.
1 <?php
9 
13 use Magento\Framework\Interception\Config\Config as InterceptionConfig;
16 
18 {
24  private $areaCodesList = [];
25 
29  private $interceptionConfig;
30 
34  private $pluginList;
35 
39  private $typeReader;
40 
44  private $cacheManager;
45 
49  private $interceptableValidator;
50 
58  public function __construct(
59  InterceptionConfig $interceptionConfig,
60  PluginList $pluginList,
61  Type $typeReader,
62  Manager $cacheManager,
63  InterceptableValidator $interceptableValidator
64  ) {
65  $this->interceptionConfig = $interceptionConfig;
66  $this->pluginList = $pluginList;
67  $this->typeReader = $typeReader;
68  $this->cacheManager = $cacheManager;
69  $this->interceptableValidator = $interceptableValidator;
70  }
71 
78  public function addAreaCode($areaCode)
79  {
80  if (empty($this->areaCodesList[$areaCode])) {
81  $this->areaCodesList[] = $areaCode;
82  }
83  }
84 
92  {
93  $interceptedInstances = $this->getInterceptedClasses($definedClasses);
94  $inheritedConfig = $this->getPluginsList($interceptedInstances);
95  $mergedAreaPlugins = $this->mergeAreaPlugins($inheritedConfig);
96  $interceptedMethods = $this->getInterceptedMethods($mergedAreaPlugins);
97 
98  return $interceptedMethods;
99  }
100 
107  private function getInterceptedClasses($definedClasses)
108  {
109  $intercepted = [];
110  foreach ($definedClasses as $definedClass) {
111  if ($this->interceptionConfig->hasPlugins($definedClass) && $this->typeReader->isConcrete($definedClass)
112  && $this->interceptableValidator->validate($definedClass)
113  ) {
114  $intercepted[] = $definedClass;
115  }
116  }
117  return $intercepted;
118  }
119 
127  private function getPluginsList($interceptedInstances)
128  {
129  $this->cacheManager->setEnabled([CompiledConfig::TYPE_IDENTIFIER], true);
130  $this->pluginList->setInterceptedClasses($interceptedInstances);
131 
132  $inheritedConfig = [];
133  foreach ($this->areaCodesList as $areaKey) {
134  $scopePriority = [Area::AREA_GLOBAL];
135  $pluginListCloned = clone $this->pluginList;
136  if ($areaKey != Area::AREA_GLOBAL) {
137  $scopePriority[] = $areaKey;
138  $pluginListCloned->setScopePriorityScheme($scopePriority);
139  }
140  $key = implode('', $scopePriority);
141  $inheritedConfig[$key] = $this->filterNullInheritance($pluginListCloned->getPluginsConfig());
142  }
143  return $inheritedConfig;
144  }
145 
152  private function filterNullInheritance($pluginInheritance)
153  {
154  $filteredData = [];
155  foreach ($pluginInheritance as $instance => $plugins) {
156  if ($plugins === null || !$this->typeReader->isConcrete($instance)) {
157  continue;
158  }
159 
160  $pluginInstances = [];
161  foreach ($plugins as $plugin) {
162  if (in_array($plugin['instance'], $pluginInstances)) {
163  continue;
164  }
165  $pluginInstances[] = $plugin['instance'];
166  }
167  $filteredData[$instance] = $pluginInstances;
168  }
169 
170  return $filteredData;
171  }
172 
179  private function mergeAreaPlugins($inheritedConfig)
180  {
181  $mergedConfig = [];
182  foreach ($inheritedConfig as $configuration) {
183  $mergedConfig = array_merge_recursive($mergedConfig, $configuration);
184  }
185  foreach ($mergedConfig as &$plugins) {
186  $plugins = array_unique($plugins);
187  }
188 
189  return $mergedConfig;
190  }
191 
198  private function getInterceptedMethods($interceptionConfiguration)
199  {
200  $pluginDefinitionList = new \Magento\Framework\Interception\Definition\Runtime();
201  foreach ($interceptionConfiguration as &$plugins) {
202  $pluginsMethods = [];
203  foreach ($plugins as $plugin) {
204  $pluginsMethods = array_unique(
205  array_merge($pluginsMethods, array_keys($pluginDefinitionList->getMethodList($plugin)))
206  );
207  }
208  $plugins = $pluginsMethods;
209  }
210  return $interceptionConfiguration;
211  }
212 }
__construct(InterceptionConfig $interceptionConfig, PluginList $pluginList, Type $typeReader, Manager $cacheManager, InterceptableValidator $interceptableValidator)
$configuration
Definition: index.php:33