Context a parametr z konfigurace

- sKopheK
- Člen | 207
Ř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
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
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
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)

- David Matějka
- Moderator | 6445
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

- David Matějka
- Moderator | 6445
Jako treba?
Casto to dobre vyresi komponenta, nebo nejakej wrapper okolo parametru…

- Vojtěch Dobeš
- Gold Partner | 1316
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
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
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
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
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
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)