Vlastní definování extensions

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
akadlec
Člen | 1326
+
-1
-

SIce jsem to nakousl vedle ale asi by to chtělo vlastní téma.

Lze nějak v nové verzi (2.3) udělat extension která bude registrovat své extensions? Vycházel jsem z ExtensionsExtension nicméně toto již nelze použít. (ve 2.2 naprosto parádní, ale 2.3 hrůza)

Vytvořím si „kontejner“ pro registraci dynamických extensions:

class CMSModulesExtension extends DI\Extensions\ExtensionsExtension
{

}

a config.neon pak tuto ext zaregistruju:

extensions:
    cmsModules : CMSModulesExtension

A teď si vytvořím sekci podobně jak tomu je s klasickými extensions:

cmsModules:
    dynaExt1 : \DynaExtensionOne
    dynaExt2 : \DynaExtensionTwo

a při spuštění na mě nette řve:

Extensions 'dynaExt1', 'dynaExt2' were added while container was being compiled.

Což předpokládám že je proto že ten „kontejner“ je vytvořen až když se to začně kompilovat takže už neaxceptuje nové extensions :(

akadlec
Člen | 1326
+
-1
-

Uf…tak sem se do toho trochu zahloubal jak to v nette teď funguje a povedlo se mi udělat hack. Jak odkazoval @enumag v parent topicu šel jsem na to cestou ExtensionsExtension ale aby to fungovalo musel jsem ji přidat ještě před spuštěním compileru. Takže prvně jsem musel šáhnout do bootstrapu a přidat tam obálku:

$configurator = new \Nette\Configurator();
//...

$configurator->defaultExtensions['modules'] = '\MyNamespace\DI\ModulesExtension';

// Create app container
$container = $configurator->createContainer();

No a taky sem musel extendovat extension co dělá tu obálku:

class ModulesExtension extends DI\Extensions\ExtensionsExtension
{

}

Tohle by mělo stačit, pak už stačí udělat sekci modules a tam registrovat ty extensions a nebo dynamicky jako to řeším třeba v balíčkovači modulů

Bylo by fajn zda by se k tomu @DavidGrudl nebo někdo jiný odpovědný za DI vyjádřil, zda je korektní takto upravit configurator a pokud jo tak zda by nebylo vhodne tam udělat spíše interface

enumag
Člen | 2118
+
+1
-

Ono hlavně není vhodné dědit ExtensionsExtension, je to sice funkční, ale hack. Psal jsem to spíše pro zajímavost než jako doporučené řešení.

Osobně nemám žádný problém s tím si všechny extensions přidávat v configu ručně (přestože jich používám asi 50).

Editoval enumag (10. 6. 2015 1:59)

akadlec
Člen | 1326
+
0
-

Jo to se mi právě taky moc nelíbí, proto ten dotaz zda by nebylo vhodné udělat interface.

Já si extension taky definuji v neonu, jenže toto byl případ kdy některé ext. potřebuju definovat dynamicky s pomocí gui. Jasně dalo by se pomocí gui editovat neon soubory s konfigurací ale já při té registraci provedu ještě pár dalších věcí okolo.