Guest User

Untitled

a guest
Jun 24th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.67 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Application;
  4.  
  5. use Nette\Utils\Neon;
  6.  
  7. /**
  8.  * Module loader
  9.  * Load all aplication modules
  10.  *
  11.  * @author Pecina Ondล™ej
  12.  * @version 1.0
  13.  */
  14. class ModuleLoader extends \Nette\Object {
  15.  
  16.   /**
  17.    *  All loaded modules
  18.    *
  19.    * @var array
  20.    */
  21.   static $modules = array();
  22.  
  23.   /**
  24.    *  Path to module cache file
  25.    *
  26.    * @var string
  27.    */
  28.   private static $configFile = null;
  29.  
  30.   /**
  31.    * @param string $appDir
  32.    * @return string
  33.    */
  34.   private static function getConfigFile($appDir) {
  35.     if (is_file($default = $appDir . "/modules.neon"))
  36.       self::$configFile = $default;
  37.     else if (is_file($dir = $appDir . "/config/modules.neon")) {
  38.       self::$configFile = $dir;
  39.     }
  40.     return self::$configFile;
  41.   }
  42.  
  43.   /**
  44.    * @param string $appDir
  45.    */  
  46.   private static function loadCache($appDir) {
  47.     self::$modules = (array) Neon::decode(@file_get_contents(self::getConfigFile($appDir)));
  48.   }
  49.  
  50.   /**
  51.    * @param \Nette\Config\Configurator $configurator
  52.    * @param \Nette\Loaders\RobotLoader $robotLoader
  53.    */
  54.   private static function createCache(\Nette\Config\Configurator $configurator, \Nette\Loaders\RobotLoader $robotLoader) {
  55.     foreach ($robotLoader->getIndexedClasses() as $className => $class) {
  56.       if (\Nette\Utils\Strings::match($className, '~AddOnModule~')) {
  57.         self::$modules[] = $className;
  58.       }
  59.     }
  60.     if (!empty(self::$modules[]))
  61.       // make writable      
  62.       @chmod(self::$configFile, 0777);    
  63.       if (!@file_put_contents(self::$configFile, Neon::encode(self::$modules[], Neon::BLOCK)))
  64.         throw new \Exception("Cant write module cache!");
  65.   }
  66.  
  67.   /**
  68.    * @param \Nette\Config\Configurator $configurator
  69.    * @param \Nette\Loaders\RobotLoader $robotLoader
  70.    * @param type $appDir
  71.    */
  72.   public static function register(\Nette\Config\Configurator $configurator, \Nette\Loaders\RobotLoader $robotLoader, $appDir) {
  73.     // load cache
  74.     self::loadCache($appDir);
  75.     // create cache
  76.     if (empty(self::$modules))
  77.       self::createCache($configurator, $robotLoader);
  78.     // registre modules
  79.     foreach (self::$modules as $moduleClass) {
  80.       $configurator->onCompile[] = function ($configurator, $compiler) {
  81.         $instance = new $moduleClass;
  82.         if (!($instance instanceof \Application\CompilerExtension\Base))
  83.           throw new \Exception("Module must be instance of \Application\CompilerExtension\Base");
  84.         if (!defined($moduleClass::moduleSlug))
  85.           throw new \Exception("Module name must be declared, $moduleClass::moduleSlug");
  86.         $compiler->addExtension($moduleClass::moduleSlug, new $moduleClass);
  87.       };
  88.     }
  89.   }
  90.  
  91. }
Add Comment
Please, Sign In to add comment