Dynamické přidávání extensions
- akadlec
- Člen | 1326
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
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
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?
- Filip Procházka
- Moderator | 4668
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
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í.
- akadlec
- Člen | 1326
@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
@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)
- Filip Procházka
- Moderator | 4668
@mrtnzlml čisté řešení neexistuje, protože nette s takovým use-casem zkrátka nepočítá.