Jak se mimo bootstrap dostanu k configu bez Nette\Environment?
- danik
- Člen | 56
Pouzivam posleni verzi samozrejme… ale proste pokud jsem spravne procet
zdrojak Nette\Configurator
, tak konfigurace se nacte, zpracuje,
nastavi se podle ni sluzby a pak uz zustane jen ulozena v tomhle globalnim
configuratoru – ke kteremu se napriklad z presenteru uz nedostanu jinak, nez
pres Environment::getConfigurator()
… a jeste navic pokud chci
pouzivat debugger, tak uz v bootstrapu musim pouzit
Environment::getConfigurator()
misto
new Nette\Configurator()
, jinak ma v sobe Environment ulozenej
prazdnej (nenakonfigurovanej) Configurator a prazdnej Context ktery si vytvari
v tom Debuggeru… zkratka: jestli framework nikde Environment nepouziva, proc
ho pouziva Debugger? Tohle je celkem neintuitivni a je to podle me navic spatne
napsany v Sandboxu (tam je v bootstrapu konstrukce s new
). A pak
se k tomu configu uz proste nedostanu nikde jinde… :o/ pokud teda nechci
pouzit Environment – a to ja nechci, DI je ubercool :o)
Muj problem je ze ne vsechno co potrebuju konfigurovat je sluzba – takze je semantickej nesmysl to jako sluzbu definovat v configu, aby se tomu kontext a konfigurace vytvarely diky DI automaticky. A tak si rikam, ze by se mi libilo neco jako:
common:
...
context:
mujModel:
var1: val1
var2: val2
mojeKomponenta:
var3: val3
var4: val4
necoJinyho:
var2345: val2345
...
a pak bych mohl nejak pri vytvareni contextu (containeru) pro nejakej objekt do toho kontejneru nasypat prislusnou sekci treba takhle:
...
$container = new DI\Container;
$container->params = $this->context->getContextConfig('mojeKomponenta');
...
Proc by mi nestacilo jenom $this->context->getConfig()
?
Protoze by se to mohlo takhle obecne koukat do configu kamkoliv – napriklad
i na hesla do db – coz neni dobry napriklad kdyz chci nechat aplikaci
otevrenou pro 3rd-party komponenty; proto bych rek, ze by bylo hezky mit pres
takovouhle funkci pristupnou nejakou jasne omezenou cast configu. Pak by treba
tyhle konfiguracni sekce mohly jit jeste vnorovat, takze kdyz si pak komponenta
pri vytvareni subkomponenty zavola
$this->context->getContextConfig('sadf')
, ma zase pristup
jenom k podsekcim svoji vlastni konfigurace…
No, je to asi docela neucesany pokud jde o nazvoslovi, ale pokud se to ideove uchyti, urcite neco vymyslime :o)
EDIT: napada me, ze by se ty metody mohly jmenovat treba
spis getSubcontext() nebo getSubcontextConfig()… protoze
$context->getContextConfig()
zni jako ze se to vztahuje k tomu
kontextu na kterym to volam, ja ale spis chci pristoupit k jeho
pod-kontextu…
Editoval danik (15. 6. 2011 22:01)
- bojovyletoun
- Člen | 667
- POZOR na tuo chybu: https://forum.nette.org/…r-vraci-null#… –
- Mě vše funguje OK bez použití Environment – ve výpisu get_included_files() není. POZOR na tuo chybu
- Za další by mohlo pomoci zapínat Debugger jako první: viz: 1 , 2
- z předchozího bodu vyplývá, já používám Debugger::enable(X,..) , kde x je buď production true nebo devel false – ušetří se tím pár ms detekce.
arron napsal(a):
Co napriklad neni sluzba a vyzaduje konfiguraci?
??
Editoval bojovyletoun (16. 6. 2011 13:19)
- danik
- Člen | 56
arron: Například: mám sadu komponent a model pro návštěvní knihu, která se dá v různých podobách vkládat do stránky (dedikovaná podstránka pro plnohodnotnou verzi, shoutbox v bočním sloupci, embed do jiného webu přes iframe…). Snad se shodneme na tom, že to není ze své podstaty služba? Pak si snadno dovedu představit, že budu mít nějakou konfiguraci pro jádro návštěvní knihy (povolit příspěvky nepřihlášeným uživatelům? používat CAPTCHA? povolit embedding do cizích webů?) a několik dalších konfigurací pro dílčí subkomponenty (nastavení stránkování pro komponentu shoutboxu, povolení ajaxu, …).
Jen jeden příklad za všechny. Prostě všude, kde chci dodržet DRY a napsat rovnou knihovnu, která bude znovupoužitelná – v ten moment musí být konfigurovatelná, i když to rozhodně není služba.
bojovyletoun: vždyť o tom jsem taky psal. Ale nakonec je mi vlastně jedno, že Environment má v sobě prázdný kontejner – vždyť framework Environment nepoužívá a já taky ne (teda rád bych ho nepoužíval), takže se mě tahle WTF chyba nedotkne, nebo se pletu?
Editoval danik (16. 6. 2011 14:30)
- Filip Procházka
- Moderator | 4668
Ne, protože si v configu nastavím, kterým službám se má co předat a
dál mě to nezajímá :) Ale kdyby náhodou, je tu vždycky
$presenter->context->params['sekce']
.
- srigi
- Nette Blogger | 558
Ak sa kces mimo Presentera dostat ku kontaineru, musis to ochcat pomocou factory.
- danik
- Člen | 56
HospiLan: ano, se Services to takhle jednoduchy je, ale ja jsem se cece ptal na komponenty a modely predevsim, ktery zadnou svoji vymazlenou sekci v configu nemaj…
srigi: no, zatim to vypada, ze takhle nejak to budu resit,
konkretne nejakou ModelFactory a ComponentFactory sluzbou.. a BasePresenter pak
muze jednoduse presmerovavat $this->createComponent($name)
na
$this->context->ComponentFactory->createComponent($this, $name);
,
pricemz v configu bude pres options
tyhle sluzby nadefinovany jaky
komponenty to umi vytvorit (podle $name) podobnou syntaxi jako se definujou
services… asi to sem pak nejak postnu, pripada mi to celkem dobry… ale na
druhy strane je to takovy nevim jestli uplne cisty reseni, protoze pak budu
vsechny (konfigurovany) komponenty vytvaret centralne misto v tovarnicce
presenteru $this->createComponentMujNos($name)
… no jeste
nevim. Nazory zkusenejch Nettistu me ale zajimaj, chvili jsem z toho vypad a
ted se to ucim skoro od nuly :oD