PageRenderTime 60ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/sites/all/modules/cool/src/Loader.php

https://gitlab.com/bossagna/meik
PHP | 155 lines | 105 code | 11 blank | 39 comment | 20 complexity | 1070caddb1c46f779d9a5d040e782d34 MD5 | raw file
  1. <?php
  2. namespace Drupal\cool;
  3. class Loader {
  4. /**
  5. * Simplify the API
  6. * @param string $folder_name
  7. * @param string $parent_class_name
  8. * @param boolean $include or not the $parent_class_name as the first item
  9. * @return array
  10. */
  11. static public function mapSubclassesAvailable($folder_name, $parent_class_name, $include = FALSE) {
  12. self::includeLibClassFilesWithPatternForEnabledModules($folder_name);
  13. $classes = self::getSubclassImplementations($parent_class_name);
  14. if ($include) {
  15. array_unshift($classes, $parent_class_name);
  16. }
  17. return $classes;
  18. }
  19. /**
  20. * Simplify the API
  21. * Returns an array with the classes that implements the specified interface
  22. * @param string $folder_name
  23. * @param string $interface_name
  24. * @return array
  25. */
  26. static public function mapImplementationsAvailable($folder_name, $interface_name) {
  27. self::includeLibClassFilesWithPatternForEnabledModules($folder_name);
  28. $classes = self::getInterfaceImplementations($interface_name);
  29. return $classes;
  30. }
  31. /**
  32. * Returns an array with the classes that extends the specified class
  33. */
  34. static public function getSubclassImplementations($parent_class_name) {
  35. $classes = array();
  36. foreach (get_declared_classes() as $class_name) {
  37. $reflection_class = new \ReflectionClass($class_name);
  38. if ($reflection_class->isSubclassOf($parent_class_name)) {
  39. $classes[$class_name] = $class_name;
  40. }
  41. }
  42. return $classes;
  43. }
  44. /**
  45. * @param $class_name
  46. * @param $parent_class_name
  47. * @return bool
  48. */
  49. static public function classIsSubclassOf($class_name, $parent_class_name) {
  50. $reflection_class = new \ReflectionClass($class_name);
  51. if ($reflection_class->isSubclassOf($parent_class_name)) {
  52. return TRUE;
  53. }
  54. return FALSE;
  55. }
  56. /**
  57. * Returns an array with the classes that implements the specified interface
  58. */
  59. static public function getInterfaceImplementations($interface_name) {
  60. $classes = array();
  61. foreach (get_declared_classes() as $class_name) {
  62. $reflection_class = new \ReflectionClass($class_name);
  63. if (!$reflection_class->isAbstract()) {
  64. if ($reflection_class->implementsinterface($interface_name)) {
  65. $classes[$class_name] = $class_name;
  66. }
  67. }
  68. }
  69. return $classes;
  70. }
  71. /**
  72. * @param string $folder_name
  73. */
  74. static public function includeLibClassFilesWithPatternForEnabledModules($folder_name) {
  75. $enabled_modules = module_list();
  76. self::includeLibClassFilesWithPattern($enabled_modules, $folder_name);
  77. }
  78. static public function includeLibClassFilesWithPattern($modules, $folder_name) {
  79. foreach ($modules as $module_name) {
  80. $module_path = drupal_get_path('module', $module_name);
  81. // PSR-0 compliant search
  82. $path = $module_path . '/lib/Drupal/' . $module_name;
  83. if (is_dir($path)) {
  84. $folders = self::listFoldersWithPattern($path, $folder_name);
  85. if (!empty($folders)) {
  86. foreach ($folders as $folder) {
  87. foreach (self::listClassesWithinFolder($folder) as $class_name) {
  88. include_once $class_name;
  89. }
  90. }
  91. }
  92. }
  93. // PSR-4 compliant search
  94. $path = $module_path . '/src';
  95. if (is_dir($path)) {
  96. $folders = self::listFoldersWithPattern($path, $folder_name);
  97. if (!empty($folders)) {
  98. foreach ($folders as $folder) {
  99. foreach (self::listClassesWithinFolder($folder) as $class_name) {
  100. include_once $class_name;
  101. }
  102. }
  103. }
  104. }
  105. }
  106. }
  107. /**
  108. * @param string $dir
  109. * @param string $pattern
  110. * @return type
  111. */
  112. static private function listFoldersWithPattern($dir, $pattern) {
  113. $folders = array();
  114. $ffs = scandir($dir);
  115. foreach ($ffs as $ff) {
  116. if ($ff != '.' && $ff != '..') {
  117. $full_path = $dir . '/' . $ff;
  118. if (is_dir($full_path)) {
  119. if (preg_match('/' . $pattern . '/', $full_path)) {
  120. $folders[] = $full_path;
  121. }
  122. else {
  123. $folders = array_merge($folders, self::listFoldersWithPattern($full_path, $pattern));
  124. }
  125. }
  126. }
  127. }
  128. return $folders;
  129. }
  130. /**
  131. * @param string $dir
  132. * @return array
  133. */
  134. static private function listClassesWithinFolder($dir) {
  135. $classes = array();
  136. $ffs = scandir($dir);
  137. foreach ($ffs as $ff) {
  138. if ($ff != '.' && $ff != '..') {
  139. $classes[] = $dir . '/' . $ff;
  140. }
  141. }
  142. return $classes;
  143. }
  144. }