Jak se mimo bootstrap dostanu k configu bez Nette\Environment?

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

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)

arron
Člen | 464
+
0
-

Co napriklad neni sluzba a vyzaduje konfiguraci?

bojovyletoun
Člen | 667
+
0
-
  • 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: 12
  • 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
+
0
-

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)

danik
Člen | 56
+
0
-

bump!!! to fakt nikdo nepotrebujete mimo bootstrap pristupovat k configu???

Filip Procházka
Moderator | 4668
+
0
-

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

Ak sa kces mimo Presentera dostat ku kontaineru, musis to ochcat pomocou factory.

danik
Člen | 56
+
0
-

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