From 77c17ea2a04876f6f84f87ffe06f223a50912728 Mon Sep 17 00:00:00 2001 From: JSifalda Date: Wed, 20 Feb 2013 17:03:53 +0100 Subject: [PATCH] Add modules support --- Flame/Config/Configurator.php | 9 +++ Flame/Config/Extensions/ModuleExtension.php | 58 +++++++++++++++++++ Flame/Config/Extensions/ModulesExtension.php | 59 ++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 Flame/Config/Extensions/ModuleExtension.php create mode 100644 Flame/Config/Extensions/ModulesExtension.php diff --git a/Flame/Config/Configurator.php b/Flame/Config/Configurator.php index f1b229f..5df5c4d 100644 --- a/Flame/Config/Configurator.php +++ b/Flame/Config/Configurator.php @@ -30,6 +30,8 @@ public function __construct($containerClass = 'Flame\DI\Container') 'parent' => $containerClass ) )); + + $this->registerModulesExtension(); } /** @@ -44,4 +46,11 @@ protected function createCompiler() ->addExtension('extensions', new Extensions\ExtensionsExtension); return $compiler; } + + protected function registerModulesExtension() + { + $this->onCompile[] = function ($configurator, $compiler) { + $compiler->addExtension('modules', new \Flame\Config\Extensions\ModulesExtension); + }; + } } diff --git a/Flame/Config/Extensions/ModuleExtension.php b/Flame/Config/Extensions/ModuleExtension.php new file mode 100644 index 0000000..ee52558 --- /dev/null +++ b/Flame/Config/Extensions/ModuleExtension.php @@ -0,0 +1,58 @@ + + * @date 20.02.13 + */ + +namespace Flame\Config\Extensions; + +use Flame\Utils\Strings; + +class ModuleExtension extends \Nette\Config\CompilerExtension +{ + + /** @var array */ + private $configFiles = array(); + + /** + * @param array $configFiles + */ + public function __construct(array $configFiles = array()) + { + $this->configFiles = $configFiles; + } + + public function loadConfiguration() + { + $builder = $this->getContainerBuilder(); + $config = $this->getConfig(); + + foreach($this->getConfigFiles() as $configFile){ + $services = $this->loadFromFile($configFile); + $this->compiler->parseServices($builder, $services); + if(isset($services['parameters'])){ + $builder->parameters = \Nette\Config\Helpers::merge($builder->parameters, $services['parameters']); + } + } + + } + + /** + * @return array + */ + protected function getConfigFiles() + { + if(count($this->configFiles)){ + return array_map(function ($config) { + if(is_array($config)) + $config = array_shift($config); + return $config; + }, $this->configFiles); + }else{ + return array(); + } + } +} + diff --git a/Flame/Config/Extensions/ModulesExtension.php b/Flame/Config/Extensions/ModulesExtension.php new file mode 100644 index 0000000..3cb90ee --- /dev/null +++ b/Flame/Config/Extensions/ModulesExtension.php @@ -0,0 +1,59 @@ + + * @date 19.02.13 + */ + +namespace Flame\Config\Extensions; + +class ModulesExtension extends \Nette\Config\CompilerExtension +{ + + public function loadConfiguration() + { + $config = $this->getConfig(); + + if(is_array($config)){ + if(count($config)){ + foreach($config as $name => $extension){ + if(!is_string($name)) + $name = $this->getExtensionName($extension); + $this->compiler->addExtension($name, $this->invokeExtension($extension)); + } + } + }else{ + throw new \Nette\InvalidStateException('Modules configuration must be array.' . gettype($config) . ' given'); + } + } + + /** + * @param $class + * @return string + */ + protected function getExtensionName($class) + { + $ref = \Nette\Reflection\ClassType::from($class); + return $ref->getShortName(); + } + + /** + * @param $class + * @return mixed + * @throws \Nette\InvalidStateException + */ + protected function invokeExtension($class) + { + $builder = $this->getContainerBuilder(); + if(is_object($class)){ + $ref = new \ReflectionClass($class->value); + return $ref->newInstance(property_exists($class, 'attributes') ? $builder->expand($class->attributes) : array()); + }elseif(is_string($class)){ + return new $class; + }else{ + throw new \Nette\InvalidStateException('Definition of extension must be valid class (string or object). ' . gettype($class) . ' given.'); + } + } + +}