Konfigurace v modulární aplikaci

- Tomáš Kolinger
 - Člen | 136
 
Zdravím, mám menší problém s vyřešení konfigurace v modulární aplikaci.
Celá aplikace je řešená pomocí modulů (například
ArticleModule, UserModule, …) a chtěl bych docílit
toho, abych mohl napsat modul s minimálním zásahem do aplikace. Ideálně
vytvořit modul a zaregistrovat ho v neonu álá:
modules:
	- App\UserModule\Module
	- App\ArticleModule\Module
Modul definuje vlastní služby, má vlastní routy a potřebuje několik dalších věcí (metodu pro instalaci, atp.).
Rozhodl jsem se tedy napsat pro každý modul nějakou třídu
Module, ta bude obsahovat metody jako install(),
registerRoutes(), … Každý Module zaregistruju jako
službu do Container-u, přes autowire dostanu co budu vyžadovat a
jsem šťastný člověk…
Jak to ale udělat s konfigurací služeb? Tam potřebuju mít
CompilerExtension nebo config.neon… Tudíž
potřebuju pracovat s Module před vytvoření
Container-u a tady nastává problém.
Řešení #1: dát do třídy Module metodu
compile a při vytváření konfigurace si z neonu vytáhnu seznam
modulů a prostě zavolám Module::compile($config, $container).
Což funguje, je to celkem pohodlné ale prostě to tam
nepatří.
Řešení #2: pro každý modul vytvořím
config.neon, oddělím konfiguraci od služby – řeší problém
z prvního řešení. Ale kde vezmu seznam modulů, když ještě nemám
Container? Jak zjistím kde se neon nachází? Napadlo mě
rozparsovat config.neon předem a vytáhnout si moduly… Cestu ke
konfiguráku si ponese modul v metodě Module::getConfigFile().
A to je prostě fůj.
<?php
class Configurator extends \Nette\Config\Configurator
{
	protected function buildContainer(& $dependencies = NULL)
	{
		$config = \Nette\Utils\Neon::decode(file_get_contents($this->parameters['appDir'] . '/config/config.neon'));
		foreach ($config['common']['cms']['modules'] as $class) {
			if ($class::getConfigFile()) {
				$this->addConfig($class::getConfigFile(), self::NONE);
			}
		}
		return parent::buildContainer($dependencies);
	}
}
?>
Řešení #3: konfigurovat aplikaci dynamicky… Přidám
třeba metodu Module::registerServices() a tam nacpu celej
Container a zavolám si $container->addService().
Což je fůj nadruhou…
Jak řešíte konfiguraci pro moduly? Existuje vůbec elegantní řešení tohoto problému?
Editoval Tomáš Kolinger (1. 1. 2013 4:09)

- llook
 - Člen | 407
 
Nijak, moduly nejsou aplikace v aplikaci, ale jenom oddělené skupiny presenterů, šablon a controlů.
Jestli ale vyvíjíš nějaký univerzální stavebnicový systém, který má běžet v několika různých sestaveních, tak ti to stačit nebude. Myslím, že je to stejný problém, jako se řeší už nějakou dobu tady: https://forum.nette.org/…ura-aplikace