fileResolver = $fileResolver; $this->areaList = $areaList; } /** * \Magento\Setup\Module\Di\Code\Scanner\ConfigurationScanner scan usage, * because the original class injection is causing error on compilation * * @param $fileName * @return array */ public function getScannedFiles($fileName) { $files = []; $areaCodes = array_merge( ['primary', \Magento\Framework\App\Area::AREA_GLOBAL], $this->areaList->getCodes() ); foreach ($areaCodes as $area) { $files = array_merge_recursive( $files, $this->fileResolver->get($fileName, $area)->toArray() ); } return array_keys($files); } /** * @param bool $all * @return array */ public function getRewrites($all = false) { $diFiles = $this->getScannedFiles('di.xml'); $moduleFiles = $this->getScannedFiles('module.xml'); array_walk($moduleFiles, function (&$item) { $item = str_replace('/module.xml', '', $item); }); if (!$all) { foreach ($diFiles as $key => $file) { preg_match('/(.*\/etc)/', $file, $matches); $resultKey = $matches[1]; if (!in_array($resultKey, $moduleFiles) || (strpos($file, '/vendor/magento') !== false) ) { unset($diFiles[$key]); } } } $rewrites = $this->_collectRewriteEntities($diFiles); return $rewrites; } /** * @param array $files * @return array */ protected function _collectRewriteEntities(array $files) { $rewrites = []; foreach ($files as $fileName) { $areaCode = 'global'; preg_match('/\/etc\/(.*)\/di.xml/', $fileName, $matches); if (isset($matches[1])) { $areaCode = $matches[1]; } $dom = new \DOMDocument(); $dom->loadXML(file_get_contents($fileName)); $xpath = new \DOMXPath($dom); /** @var $node \DOMNode */ foreach ($xpath->query('//preference') as $node) { $originalClass = $node->getAttribute('for'); $rewriteClass = $node->getAttribute('type'); if (!isset($rewrites[$originalClass]) || !isset($rewrites[$originalClass][$areaCode]) || !in_array($rewriteClass, $rewrites[$originalClass][$areaCode])) { $rewrites[$originalClass][$areaCode][] = $rewriteClass; } } } return $rewrites; } }