Dynamické přidávání extensions

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

Mám strukturu aplikace postavenou tak, že veškeré hlavní části jsou ve vendor složce composeru. Pak mám ještě mimo composer složku s moduly apliakce. Mám vytvořenou službu která mi tyto moduly načte, zatím tedy vše ok. Ale je nějak možné dynamicky rozšířit extensions co se definují? Aby je mohl do nette registrovat ten loader?

Normálně bych si v config.neon udělal toto:

extensions:
	moduleFinder : \My\Namespace\ModuleFinderExtension
	moduleOne : \My\Namespace\ModuleOneExtension
	moduleTwo : \My\Namespace\ModuleTwoExtension

No a místo toho bych měl jen:

extensions:
	moduleFinder : \My\Namespace\ModuleFinderExtension

A v extension moduleFinder si ty moduly vyhledám a „magicky“ registruji. A teď mě právě zajímá ta magie, zda se dá nějak udělat?

enumag
Člen | 2118
+
0
-

Každé extension může registrovat další extensions, stačí tedy když si zavedeš nějaké konvence abys je uměl najít.

akadlec
Člen | 1326
+
0
-

Perfektos díky za tip

akadlec
Člen | 1326
+
0
-

Je ještě dotaz. Dá se z té extension nějak udělat služba abych k ní mohl přistupovat? Když ji registruju takto:

$this->compiler->addExtension('myDynamicExtension', new \My\Namespace\ModuleTwoExtension);

Tak bych se chtěl v presenteru dostat k té třídě: \My\Namespace\ModuleTwoExtension resp. objektu. Nebo je to blbost?

enumag
Člen | 2118
+
+1
-

To je blbost, objekty typu extension se vytváří pouze když se kompiluje DIC, tedy jen když něco změníš nebo smažeš cache. Na co to potřebuješ?

akadlec
Člen | 1326
+
0
-

Na správu modulu aplikace přes GUIčko. Ale asi sem to obešel jinak.

enumag
Člen | 2118
+
0
-

@FilipProcházka Hmm koukám že Compiler se začíná plnit výjimkama pro určitá extensions. To mi nepřipadá jako dobrý nápad. :-/

EDIT: Ale projde to pokud podědíš ExtensionsExtension.

Editoval enumag (31. 5. 2015 11:15)

Filip Procházka
Moderator | 4668
+
0
-

@enumag to nezní jako čisté řešení.

enumag
Člen | 2118
+
0
-

@FilipProcházka Netvrdím že je to čisté, samozřejmě že je to hack. :-))

Filip Procházka
Moderator | 4668
+
0
-

Já to chtěl jen explicitně zmínit, aby to nějaký začátečník nezkoušel jakože „četl jsem to na fóru“ :)

akadlec
Člen | 1326
+
0
-

Pokud se tu teda bavíte o mém dotazu jaz extension udělat službu tak to asi raději uzavřeme pokud je to tak špatné ;) Raději to udělám jako další objekty se kterýma budu pracovat.

Spíš by se mě teď hodilo zda se dá nějak z instancovaného objektu udělat služba? V CompilerExtension si vytvořím objekt File repozitáře abych načetl co se má dynamicky vytvořit, ale zároveň tento repozitář bych potřeboval mít jinde jako službu. Samo můžu ji nechat vytvořit znova, ale moc se mi nelíbí takové dvojí vytváření.

enumag
Člen | 2118
+
+2
-

@akadlec Vytvořit znova protože jak jsem už zmínil, kód CompilerExtension se zdaleka neprovádí při každém dotazu. Je celkem jedno že to bude neefektivní. Obecně se snaž co nejvíc práce udělat v CompilerExtension aby runtime byl rychlý.

Editoval enumag (31. 5. 2015 14:33)

akadlec
Člen | 1326
+
0
-

@enumag jasný, poměrně dost sem toho přesunul právě jak zmiňuješ do CompilerExtension. Holt ten objekt se vytvoří dvakrát no.

A ještě se narazil na jeden problém k té dynamice. Chtěl jsem udělat i takový dynamický robotloader. Ty balíčky mám v definované složce kde jich je X a na základě konfigurace se načtou nebo nenačtou a aby robotloader nepročuchával celou složku tak jsem je chtěl přidávat dynamicky. Jednoduše jsem si vytáhl Composer a jeho loader, to jde bez problému a z konfigu balíčku jsem přidal jeho třídy/mapu. S prázdnou cache je to pohoda, vše jede jak má, ale samo že když už se cache vytvoří tak je problém protože se ty třídy hledají dříve než se includují. V CompilerExtension asi není k dispozici stav „před“ načtením robotloaderu?

akadlec
Člen | 1326
+
-1
-

@FilipProcházka tak sem konečně udělal upgrade na 2.3 a narazil na to cos zmínil. Lze to nějak tedy vyřešit nebo se v nette změnilo něco co mě to teď zruší?

Extensions ‚xxx‘ were added while container was being compiled.

Mám udělanou zatím takovou FakeExtension:

class CMSModulesExtension extends DI\Extensions\ExtensionsExtension
{

}

a config.neon pak tuto ext zaregistrovanou:

extensions:
	cmsModules : CMSModulesExtension

a pak ještě mám udělanou sekci kde definuji ty dynamické ext:

cmsModules:
	dynaExt1 : DynaExtensionOne
	dynaExt2 : DynaExtensionTwo

a stejnak mi to řve hlášku viz výše…

PS: super upgrade nette jen co je fakt :/ asi to rollbacku zpět na 2.2.x a zafreezuju na této verzi :/

Editoval akadlec (9. 6. 2015 0:12)

akadlec
Člen | 1326
+
0
-

Tak poslední bod dotazu vyřešen…heureka

Nicméně můj dotaz je stále k řešení ;)

Filip Procházka
Moderator | 4668
+
+1
-

Já bych raději zůstal u toho nazývat to hackem, né řešením.

mrtnzlml
Člen | 140
+
+1
-

Filip Procházka napsal(a):

Já bych raději zůstal u toho nazývat to hackem, né řešením.

Omlouvám se, že oživuji toto téma. Jaké by bylo čistější řešení? Potřebuji udělat něco podobného…

Filip Procházka
Moderator | 4668
+
0
-

@mrtnzlml čisté řešení neexistuje, protože nette s takovým use-casem zkrátka nepočítá.