Context a parametr z konfigurace

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

Řekněme, že potřebuji získat v presenteru parametr z configu ze sekce parameters, tak si ho vytáhnu přes $this->context->parameters[<jmeno_parametru>]);. Funguje to v pořádku, nicméně jsem někde četl, že se to přes context nemá řešit, tak bych se rád zeptal (starších a) zkušenějších, jaké jsou na tohle best practices.

David Matějka
Moderator | 6445
+
0
-

Spravne reseni je sluzba, ktere ten parametr predas v neonu. Pokud parametr potrebujes v presenteru, muzes presenter registrovat jako sluzbu a parametr tam hodit treba pres setter

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Příklad:

class HomepagePresenter extends Nette\Application\UI\Presenter
{
	private $foo;

	public function setFoo($foo)
	{
		$this->foo = $foo;
	}
}

Konfigurace

parameters:
	foo: 'test'

services:
	HomepagePresenter:
		setup:
			- setFoo(%foo%)

Editoval vojtech.dobes (11. 3. 2014 14:36)

sKopheK
Člen | 207
+
0
-

Diky. Rvalo to na me neco o chybejici class / factory v definici sluzby, tak sem to pridal a jede to, ale jak to udelat pro vsechny presentery, kdyz potrebuji treba nejaky parametr pro @layout? Pro abstraktniho predka ta sluzba udelat samozrejme nejde.

A kdyz uz vas tu teda obtezuju, tak jak nejlepe pristoupit ve staticke metode napr. k injectnute service, ktera je dostupna z presenteru, nebo parametru URL v pozadavku apod.? Pres \Nette\Environment::getApplication()->getPresenter() to funguje, ale neni to asi nejpeknejsi.

Editoval sKopheK (13. 3. 2014 10:02)

srigi
Nette Blogger | 559
+
0
-

vojtech.dobes napsal(a):

V Nette 2.1 mi funguje aj strucnejsi zapis:

class HomepagePresenter extends Nette\Application\UI\Presenter
{
  public $foo;
}
parameters:
  foo: 'test'

services:
  HomepagePresenter:
    setup:
      - $foo(%foo%)
David Matějka
Moderator | 6445
+
0
-

jak nejlepe pristoupit ve staticke metode napr. k injectnute service, ktera je dostupna z presenteru, nebo parametru URL v pozadavku apod.?

parametr/sluzbu si musis predat jako argument

sKopheK
Člen | 207
+
0
-

A jak byste resili ty parametry napr. pro layout?

David Matějka
Moderator | 6445
+
0
-

Jako treba?

Casto to dobre vyresi komponenta, nebo nejakej wrapper okolo parametru…

sKopheK
Člen | 207
+
0
-

Treba emailova adresa na administratora, kterou chci mit v configu. Chci ji zobrazit v odkazu v paticce a taky s ni pracovat pri odesilani mailu.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Prostě si ji předej všude tam, kde je potřeba, ne? Jak si ji předat do presenteru je ukázáno v tomto vláknu, do libovolné služby se to dá udělat totožným způsobem. Co přesně je ještě nejasné?

sKopheK
Člen | 207
+
0
-

sKopheK napsal(a):

…ale jak to udelat pro vsechny presentery, kdyz potrebuji treba nejaky parametr pro @layout? Pro abstraktniho predka ta sluzba udelat samozrejme nejde.

takze si mam vytvorit vlastni sluzbu, ktera bude defacto slouzit jako registr konfiguracnich promennych? prijde mi to jako zabijeni komara kladivem, kdyz to jde tak jednoduse pres context, ktery ale pry neni cisty

Jiří Nápravník
Člen | 710
+
0
-

Ad e-mail administratora: do sluzeb urcite predat ciste a na context ani napad. Do paticky, to bude idealni basepresenter, a v basepresenteru si ja osobne klidne sahnu na context

Service jako registr konfiguracnich promennych, tj vhodne spise pokud mas nejaky parametry, ktery budes pouzivat na hodne mistech. Pokud jde ale o jednu hodnotu, tak mas lepsi ji tam poslat pres parametr v neonu, jako ti radi vyse.

Ale samozrejme klidne muzes pouzivat context, jen to neni dobra praktika, je to deprecated, takze to bue nejspise brzo vyhozeno z frameworku

David Matějka
Moderator | 6445
+
0
-

e-mail administratora – co takhle paticku jako komponentu?

registr parametru – ne, spis jednoucelova sluzba ve stylu WebConfiguration, ktera bude mit setter a gettery pro email administratora, nazev webu atd.

sKopheK
Člen | 207
+
0
-

Nakonec jsem to vyresil tak, ze je je vytvorena komponenta Registry, ktera ma ve sve jedine magicke metode __call() zkontroluje, zda se vola setXY() s parametrem nebo getXY() a nastavi do / vrati z chraneneho pole predanou / pozadovanou hodnotu. Config pak vypada nasledovne:

parameters:
        appName: Aplikace
        adminEmail: skophek@aplikace.cz
services:
	Registry:
		class: namespace\Registry
		setup:
			- setApplicationName(%appName%)
			- setAdminEmail(%adminEmail%)
duskohu
Člen | 778
+
0
-

vojtech.dobes napsal(a):

Příklad:

class HomepagePresenter extends Nette\Application\UI\Presenter
{
	private $foo;

	public function setFoo($foo)
	{
		$this->foo = $foo;
	}
}

Konfigurace

parameters:
	foo: 'test'

services:
	HomepagePresenter:
		setup:
			- setFoo(%foo%)

Lenze toto nefunguje ked to potrebujem dat do MyPresenter a ten dedi od BasePresenter v nom nejaku tovarnicku ktora pouziva:

$control = $this->myControlFactory->create();

Sposobi mi to ze ked vytvara …/temp/cache/_Nette.Configurator:
Nette\InvalidArgumentException
Component name must be integer or string, NULL given

Editoval duskohu (1. 5. 2014 10:42)