Konfigurace v modulární aplikaci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Kolinger
Člen | 136
+
0
-

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
+
0
-

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

Michalek
Člen | 211
+
0
-

config.neon

includes:
	- ../HomepageModule/config/config.neon
	- ../AdminModule/config/config.neon

HomepageModule/config/config.neon

services:
 loader:
  setup:
   - \Miw\Module\Homepage::createRoute(@router)

Pomůže to? :-)

Editoval Michalek (1. 1. 2013 9:27)

Filip Procházka
Moderator | 4668
+
0
-

A co tohle, kluci? :)