Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace Application;
- use Nette\Utils\Neon;
- /**
- * Module loader
- * Load all aplication modules
- *
- * @author Pecina Ondลej
- * @version 1.0
- */
- class ModuleLoader extends \Nette\Object {
- /**
- * All loaded modules
- *
- * @var array
- */
- static $modules = array();
- /**
- * Path to module cache file
- *
- * @var string
- */
- private static $configFile = null;
- /**
- * @param string $appDir
- * @return string
- */
- private static function getConfigFile($appDir) {
- if (is_file($default = $appDir . "/modules.neon"))
- self::$configFile = $default;
- else if (is_file($dir = $appDir . "/config/modules.neon")) {
- self::$configFile = $dir;
- }
- return self::$configFile;
- }
- /**
- * @param string $appDir
- */
- private static function loadCache($appDir) {
- self::$modules = (array) Neon::decode(@file_get_contents(self::getConfigFile($appDir)));
- }
- /**
- * @param \Nette\Config\Configurator $configurator
- * @param \Nette\Loaders\RobotLoader $robotLoader
- */
- private static function createCache(\Nette\Config\Configurator $configurator, \Nette\Loaders\RobotLoader $robotLoader) {
- foreach ($robotLoader->getIndexedClasses() as $className => $class) {
- if (\Nette\Utils\Strings::match($className, '~AddOnModule~')) {
- self::$modules[] = $className;
- }
- }
- if (!empty(self::$modules[]))
- // make writable
- @chmod(self::$configFile, 0777);
- if (!@file_put_contents(self::$configFile, Neon::encode(self::$modules[], Neon::BLOCK)))
- throw new \Exception("Cant write module cache!");
- }
- /**
- * @param \Nette\Config\Configurator $configurator
- * @param \Nette\Loaders\RobotLoader $robotLoader
- * @param type $appDir
- */
- public static function register(\Nette\Config\Configurator $configurator, \Nette\Loaders\RobotLoader $robotLoader, $appDir) {
- // load cache
- self::loadCache($appDir);
- // create cache
- if (empty(self::$modules))
- self::createCache($configurator, $robotLoader);
- // registre modules
- foreach (self::$modules as $moduleClass) {
- $configurator->onCompile[] = function ($configurator, $compiler) {
- $instance = new $moduleClass;
- if (!($instance instanceof \Application\CompilerExtension\Base))
- throw new \Exception("Module must be instance of \Application\CompilerExtension\Base");
- if (!defined($moduleClass::moduleSlug))
- throw new \Exception("Module name must be declared, $moduleClass::moduleSlug");
- $compiler->addExtension($moduleClass::moduleSlug, new $moduleClass);
- };
- }
- }
- }
Add Comment
Please, Sign In to add comment