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