Jak do presenteru nainjektovat skalární proměnou z konfiguračního souboru

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

Chtěl bych si do presenteru nainjektovat proměnnou z konfiguračního souboru, dejme tomu appDir. Dá se to nějak provést nebo to funguje jen s objekty? Není to nesmysl, když se k proměnným z konfiguračnho souboru dá přistupovat přes context (myslím)?

Jan Suchánek
Člen | 404
+
0
-

Proc to potrebujes?

fary
Člen | 155
+
0
-

Potřeboval bych ty proměnné dostat jak do presenteru tak i do šablon. Sice to jde přes context, ale nevím, který je lepší způsob. Pokud bych měl např. repositář, tak si ho zaregistruju jako service a nainjektuju si tam vše, co bude třeba, ale jak je to vhodné u presenteru?

Jan Suchánek
Člen | 404
+
0
-

Do presenteru je pak davat nemusis, kdyz budou v service. Dej je do service.

MartinitCZ
Člen | 580
+
0
-

Nebo si udělej nějakou ParameterService a do ní si hod všechny parametry, kterou si injectuješ do presenteru.
Nicméně doporučený způsob je ten, co tu popsal @jenicek

David Matějka
Moderator | 6445
+
+1
-

Pokud potrebujes dostat parametr do jednoho konkretniho presenteru, muzes presenter registrovat jako sluzbu a parametr tam dostat pres setter:

services:
	-
		class: App\MyPresenter
		setup:
			- setFoo(%foo%)

To vsak nebude fungovat pokud potrebujes dostat parametr do BasePresenteru.

Funkcni pro vse a lepsi je, jak uz tu bylo zmineno, predavat onen parametr do sluzeb, pripadne do komponent. Obecnym „ParameterService“, ktere budou obsahovat vsechny parametry, se radeji vyhni. To uz rovnou muzes pouzit context :)

Editoval matej21 (19. 6. 2014 23:01)

fary
Člen | 155
+
0
-

Věc se má tak, že bych tu proměnnou (případně více proměnných) potřeboval dostat právě do BasePresenteru, který mám jako abstraktní. Kontext nepoužívám, zvykl jsem si na DI (a je to naprostá paráda :-) ). Abstraktní presenter si jako službu zaregistrovat nemůžu, protože se nevytvoří jeho instance (protože je abstraktní). Mohl bych si tedy vytvořit třídu, kterou zaregistruji jako službu a nainjektuju ji do BasePresenteru např. pomocí metody inject*, ovšem bude tam jedna třída navíc, která bude působit jako pěst na oko :-). Je to pravděpodobně lepší, než používat kontext a já souhlasím, ale musí existovat i nějaký hezčí způsob, jak toho docílit. Leda že bych BasePresenter dal jako neabstraktní, ovšem to je zase spíše takové obejítí problému, než jeho vyřešení.

Oli
Člen | 1215
+
0
-

Zaregistrovat si třídu, která ti obalí nějakou skupinu nastavení je podle mě validní. Já mám třeba takhle třídu pro nastavení aplikace: který objekty jsou zapnutý, kolik je ve stránkování položek na stránku, jestli mají články zapnutý komentáře, … a tu třídu si potom injectnu, kde potřebuju včetně basePresenteru.

Jan Suchánek
Člen | 404
+
0
-

@Oli a ciselniky z databaze taky?

Oli
Člen | 1215
+
0
-

@jenicek To si myslím, že už tam nepatří. Ta moje třída jen obaluje nastavení, které by mohlo být vždy u aktuální situace, ale tady je pěkně na jednom místě. Číselník z db už vnímám jako další závislost.

Nicméně záleží na situaci. Uměl bych si představit situaci, kdy například budeš takhle nastavovat personalizovaný články. Z configu potom taháš nějakej default nastavení a z db ho můžeš přepsat osobním nastavením uživatele.