Nastavení komponenty z vlastního .neon-u

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

Dobrý den,
marně si lámu hlavu s vytvořením komponenty, která si bude brát nastavení z neonu, který se nachází ve složce s komponentou.
Mohl by mě, prosím, někdo alespoň popostrčit správným směrem?

Pavel Kravčík
Člen | 1196
+
0
-

\Nette\Neon\Neon::decode() + třeba Finder.

Hendrix
Člen | 4
+
0
-

a není v nette nějaká příjemnější cesta za použití eg.
Nette\Configurator nebo Nette\DI\CompilerExtension ?

Pavel Kravčík
Člen | 1196
+
0
-

Záleží, co konkrétně chceš. Myslel jsem, že nějaké vlastní nastavení pro tu komponentu.

Osobně používám něco podobného. Iteruji nad všemi moduly (UzivatelModule,ArticleModule) a každý má vlastní config, kde je nastavení ACL, menu apod.

//boostrap.php
foreach(Finder() as $config)
{
	$configurator->addConfig($config);
}
Šaman
Člen | 2666
+
0
-

Asi bych to řešil přes include a samotné vytvoření služby by bylo v tom includovaném configu.

Hendrix
Člen | 4
+
0
-

Šaman napsal(a):

Asi bych to řešil přes include a samotné vytvoření služby by bylo v tom includovaném configu.

Nebyla by pak takto vytvořená služba dostupná všude? Lze nějak definovat, aby byla dostupná jen v dané komponentě?

Šaman
Člen | 2666
+
+2
-

Myslel jsem to takhle:
app/components/config.components.neon

includes:
    - fooBar/config.neon

app/components/fooBar/config.neon

parameters:
    param1: "foo"
    param2: "bar"

services:
    bar: NS\Bar
    fooBar:
        class: App\Components\IFooBarFactory(%param1%, %param2%)
        setup:
            - setFoo(@bar)

Výhoda je, že složitější konfiguraci máš společně s komponentou a ‚připojíš‘ ji jen includnutím jejího configu. Samozřejmě, že ji pak máš definovanou všude…
Jestli to chápu, tak to jde o to, aby jsi v té mé ukázce neměl %param% a @bar globálně dostupné? Pak asi opravdu jen ručně si dekódovat její neon, třeba v konstruktoru. Zatím jsem se ale nesetkal s potřebou některé služby a parametry skrývat. A pokud jde jen o křížení názvů, tak to vyřeší prefixy.


Edit: Resp. parametry můžeš nastavit přímo a na tu službu bar si můžeš udělat továrničku (klidně i jen statickou) a pomocí ní předat setupu jen nepojmenovanou instanci pomocí: (stejně jako se vytváří třeba router)

services:
   fooBar:
       class: App\Components\IFooBarFactory("foo", "bar")
       setup:
           - setFoo(NS\Bar::create)

Editoval Šaman (24. 2. 2015 17:09)