loader.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. namespace MGModule\DNSManager2;
  3. use MGModule\DNSManager2 as main;
  4. if(!defined('DS'))define('DS',DIRECTORY_SEPARATOR);
  5. /**
  6. * Module Class Loader
  7. *
  8. * @author Michal Czech <michael@modulesgarden.com>
  9. */
  10. require_once __DIR__ . DS . 'vendor' . DS . 'autoload.php';
  11. if(!class_exists(__NAMESPACE__.'\loader')){
  12. class loader {
  13. static $whmcsDir;
  14. static $myName;
  15. static $avaiableDirs = array();
  16. /**
  17. * Set Paths
  18. *
  19. * @param string $dir
  20. */
  21. function __construct($dir = null){
  22. if(empty($dir))
  23. {
  24. $checkDirs = array(
  25. 'modules'.DS.'addons'.DS
  26. ,'modules'.DS.'servers'.DS
  27. );
  28. self::$myName = substr(__NAMESPACE__, 9);
  29. foreach($checkDirs as $dir)
  30. {
  31. if($pos = strpos(__DIR__,$dir.self::$myName))
  32. {
  33. self::$whmcsDir = substr(__DIR__,0,$pos);
  34. break;
  35. }
  36. }
  37. if(self::$whmcsDir)
  38. {
  39. foreach($checkDirs as $dir)
  40. {
  41. $tmp = self::$whmcsDir.$dir.self::$myName;
  42. if(file_exists($tmp))
  43. {
  44. self::$avaiableDirs[] = $tmp.DS;
  45. }
  46. }
  47. }
  48. }
  49. else
  50. {
  51. self::$mainDir = $dir;
  52. }
  53. spl_autoload_register(array($this,'loader'));
  54. }
  55. /**
  56. * Load Class File
  57. *
  58. * @author Michal Czech <michael@modulesgarden.com>
  59. * @param string $className
  60. * @return bool
  61. * @throws main\mgLibs\exceptions\base
  62. * @throws \Exception
  63. */
  64. static function loader($className){
  65. if(strpos($className, __NAMESPACE__) !== false)
  66. {
  67. $className = substr($className,strlen(__NAMESPACE__));
  68. }
  69. else
  70. {
  71. return;
  72. }
  73. $originClassName = $className;
  74. $className = ltrim($className, '\\');
  75. $fileName = '';
  76. $namespace = '';
  77. if ($lastNsPos = strrpos($className, '\\')) {
  78. $namespace = substr($className, 0, $lastNsPos);
  79. $className = substr($className, $lastNsPos + 1);
  80. $fileName = str_replace('\\', DS, $namespace).DS;
  81. }
  82. $fileName .= str_replace('_', DS, $className) . '.php';
  83. $foundFile = false;
  84. $error = array();
  85. foreach(self::$avaiableDirs as $dir)
  86. {
  87. $tmp = $dir.$fileName;
  88. if(file_exists($tmp))
  89. {
  90. if($foundFile)
  91. {
  92. //todo THROW ERROR FOR DEVELOPER
  93. }
  94. else
  95. {
  96. $foundFile = $tmp;
  97. }
  98. }
  99. }
  100. if($foundFile)
  101. {
  102. require_once $foundFile;
  103. if(!class_exists(__NAMESPACE__.$originClassName) && !interface_exists(__NAMESPACE__.$originClassName))
  104. {
  105. $error['message'] = 'Unable to find class:'.$originClassName.' in file:'.$foundFile;
  106. $error['code'] = main\mgLibs\exceptions\codes::MISING_FILE_CLASS;
  107. }
  108. }
  109. else
  110. {
  111. $error['message'] = 'Unable to load Class:'.$originClassName;
  112. $error['code'] = main\mgLibs\exceptions\codes::MISING_FILE_CLASS;
  113. }
  114. if($error)
  115. {
  116. if(class_exists(__NAMESPACE__.'\mgLibs\exceptions\base',false))
  117. {
  118. // throw new main\mgLibs\exceptions\base($error['message'], $error['code']);
  119. }
  120. else
  121. {
  122. //throw new \Exception($error['message'], $error['code']);
  123. }
  124. }
  125. return true;
  126. }
  127. static function listClassesInNamespace($className){
  128. $originClassName = $className;
  129. $className = ltrim($className, '\\');
  130. $fileName = '';
  131. $namespace = '';
  132. if ($lastNsPos = strrpos($className, '\\')) {
  133. $namespace = substr($className, 0, $lastNsPos);
  134. $className = substr($className, $lastNsPos + 1);
  135. $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  136. }
  137. $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className);
  138. foreach(self::$avaiableDirs as $dir)
  139. {
  140. $tmp = $dir.$fileName;
  141. if(file_exists($tmp))
  142. {
  143. $foundFile = $tmp;
  144. }
  145. }
  146. $files = array();
  147. if ($handle = opendir($foundFile)) {
  148. while (false !== ($entry = readdir($handle))) {
  149. if (
  150. $entry != "."
  151. && $entry != ".."
  152. && strpos($entry,'.php') === (strlen($entry)-4)
  153. ) {
  154. $files[] = __NAMESPACE__.'\\'.$originClassName.'\\'.substr($entry, 0,strlen($entry)-4);
  155. }
  156. }
  157. closedir($handle);
  158. }
  159. return $files;
  160. }
  161. }
  162. }