57 'frontend' =>
'Magento\Theme',
58 'adminhtml' =>
'Magento\Adminhtml',
68 public function __construct(array $mapRouters, array $mapLayoutBlocks, array $pluginMap = [])
70 $this->_mapRouters = $mapRouters;
71 $this->_mapLayoutBlocks = $mapLayoutBlocks;
73 $this->pluginMap = $pluginMap ?:
null;
87 if (!in_array($fileType, [
'php',
'template'])) {
91 $dependenciesInfo = [];
92 $dependenciesInfo = $this->considerCaseDependencies(
94 $this->caseClassesAndIdentifiers($currentModule, $file,
$contents)
96 $dependenciesInfo = $this->considerCaseDependencies(
100 $dependenciesInfo = $this->considerCaseDependencies(
104 return $dependenciesInfo;
115 private function caseClassesAndIdentifiers($currentModule, $file, &
$contents)
117 $pattern =
'~\b(?<class>(?<module>(' 122 .
'[_\\\\])[a-zA-Z0-9]+)' 123 .
'(?<class_inside_module>[a-zA-Z0-9_\\\\]*))\b(?:::(?<module_scoped_key>[a-z0-9_]+)[\'"])?~';
129 $dependenciesInfo = [];
130 $matches[
'module'] = array_unique($matches[
'module']);
131 foreach ($matches[
'module'] as
$i => $referenceModule) {
132 $referenceModule = str_replace(
'_',
'\\', $referenceModule);
133 if ($currentModule == $referenceModule) {
137 $dependencyClass = trim($matches[
'class'][
$i]);
138 if (empty($matches[
'class_inside_module'][
$i]) && !empty($matches[
'module_scoped_key'][
$i])) {
141 $currentClass = $this->getClassFromFilepath($file, $currentModule);
142 $dependencyType = $this->isPluginDependency($currentClass, $dependencyClass)
147 $dependenciesInfo[] = [
148 'module' => $referenceModule,
149 'type' => $dependencyType,
150 'source' => $dependencyClass,
154 return $dependenciesInfo;
164 private function getClassFromFilepath($filepath, $module)
166 $class = strstr($filepath, str_replace([
'_',
'\\',
'/'], DIRECTORY_SEPARATOR, $module));
167 $class = str_replace(DIRECTORY_SEPARATOR,
'\\', strstr(
$class,
'.php',
true));
175 private function loadDiFiles()
177 if (!$this->diFiles) {
180 return $this->diFiles;
188 private function loadPluginMap()
190 if (!$this->pluginMap) {
191 foreach ($this->loadDiFiles() as $filepath) {
192 $dom = new \DOMDocument();
194 $typeNodes = $dom->getElementsByTagName(
'type');
196 foreach ($typeNodes as
$type) {
198 foreach (
$type->getElementsByTagName(
'plugin') as $plugin) {
199 $subject =
$type->getAttribute(
'name');
200 $pluginType = $plugin->getAttribute(
'type');
201 $this->pluginMap[$pluginType] = $subject;
206 return $this->pluginMap;
218 private function isPluginDependency($dependent, $dependency)
220 $pluginMap = $this->loadPluginMap();
221 $subject = isset($pluginMap[$dependent])
222 ? $pluginMap[$dependent]
224 if ($subject === $dependency) {
227 $subjectModule = substr($subject, 0, strpos($subject,
'\\', 9));
228 return strpos($dependency, $subjectModule) === 0;
245 $pattern =
'/[\->:]+(?<source>getUrl\([\'"](?<router>[\w\/*]+)[\'"])/';
249 return $dependencies;
252 foreach ($matches as
$item) {
253 $router = str_replace(
'/',
'\\',
$item[
'router']);
254 if (isset($this->_mapRouters[$router])) {
255 $modules = $this->_mapRouters[$router];
256 if (!in_array($currentModule, $modules)) {
257 foreach ($modules as $module) {
261 'source' =>
$item[
'source'],
267 return $dependencies;
281 $pattern =
'/[\->:]+(?<source>(?:getBlock|getBlockHtml)\([\'"](?<block>[\w\.\-]+)[\'"]\))/';
290 foreach ($matches as $match) {
291 if (in_array($match[
'block'], [
'root',
'content'])) {
295 $module = isset($check[
'module']) ? $check[
'module'] :
null;
299 'source' => $match[
'source'],
315 if ($fileType ==
'php') {
319 if (preg_match(
'/\/(?<area>adminhtml|frontend)\//', $file, $matches)) {
320 $area = $matches[
'area'];
340 if (isset($this->_mapLayoutBlocks[$area][
$block]) || $area ===
null) {
343 if ($area ===
null) {
344 foreach ($this->_mapLayoutBlocks as $blocks) {
345 if (array_key_exists(
$block, $blocks)) {
346 $modules += $blocks[
$block];
350 $modules = $this->_mapLayoutBlocks[$area][
$block];
352 if (isset($modules[$currentModule])) {
353 return [
'module' =>
null];
356 if (1 == count($modules)) {
357 return [
'module' => current($modules)];
361 if (isset($modules[$defaultModule])) {
362 return [
'module' => $defaultModule];
377 if (isset($this->_defaultModules[$area])) {
378 return $this->_defaultModules[$area];
392 foreach ($dependencies as $module =>
$value) {
403 private function considerCaseDependencies($known, $new)
405 return array_merge($known, $new);
elseif(isset( $params[ 'redirect_parent']))
getDependencyInfo($currentModule, $fileType, $file, &$contents)
_getAreaByFile($file, $fileType)
__construct(array $mapRouters, array $mapLayoutBlocks, array $pluginMap=[])
$_option $_optionId $class
_checkDependencyLayoutBlock($currentModule, $area, $block)
_caseLayoutBlock($currentModule, $fileType, $file, &$contents)
_caseGetUrl($currentModule, &$contents)
_getUniqueDependencies($dependencies=[])
_getDefaultModuleName($area='default')