Načtení hodnot z konfigu :-(

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

Zdravím,
mám problém s načetením hodnot z konfigurace. Na fóru jsem něco našel, ale nefunguje.

v konfigu mám:

parameters:
	resourceSerial: "0.0.1"

services:
	-
		class: App\Presenters\BasePresenter
		setup:
			- setResourceSerial(%resourceSerial%)

a pak v BasePresenteru:

public $resourceSerial;

public function setResourceSerial($serial)
{
	$this->resourceSerial= $serial;
}

Spuštění webu padne na držku:

Nette\DI\ServiceCreationException
Class App\Presenters\BasePresenter used in service '22' not found or is not instantiable.

Poradíte mi prosím? Děkuji.

Michal Vyšinský
Člen | 608
+
0
-

v jakém namespace máš ten presenter?

Jarda77
Člen | 10
+
0
-

v App\Presenters

Zkoušel jsem tam dávat i HomePresenter, který není abstraktní, ale dostal jsem stejnou chybu

Šaman
Člen | 2666
+
+2
-

Takhle to nefunguje. Ty se snažíš vytvořit instanci BasePresenteru. Ten je ale pouze abstraktní předek všech presenterů.

Já to dělám pomocí služby, která dostane ony parametry a kterou si pak normálně injectnu. To doporučuji i tady – vytvořit službu ResourceVersioning (nebo podle toho co ta hodnota znamená). Ta dostane parametr v konstruktoru a bude mít metodu getSerial(). A tu si do BasePresenteru můžeš bez problémů injectnout.

V novém Nette je prý nějak možné zapsat tento požadavek podobně, jak jsi zamýšlel. Ale nikoliv přes services ale nějak říct, že všichni potomci mají dostat ten parametr.

Michal Vyšinský
Člen | 608
+
0
-

jestli si jsi jistý tím namespace tak zkus smazat cache, jo s tím BasePresenterem je to pravda, že ten nelze použít jako službu – můžeš ale použít dekorátor:

decorator:
	App\Presenters\BasePresenter:
		setup:
			- setResourceSerial(%resourceSerial%)
Jarda77
Člen | 10
+
0
-

To jsem asi viděl, pomluvili tě tam, že to děláš neuvěřitelně prasácky… :-D Paradoxní na tom je to, že jsem někde našel příklad právě s Presenterem. Jsem z toho docela běsný, načtený konfigurace a musím proto psát další objekty…

Jestli jsi myslel rozšíření DI, tak to jsem četl, zkoušel a také padne na držku. Přijde, že jediné co nette umí je, vypisovat chyby laděnkou.

Jarda77
Člen | 10
+
0
-

to bych ale zase nechtěl. Pokud už musím použít pro klienta nette, tak ať to mám „dobře“. Takže bych se přikláněl k použití služby (ikdyž mi to přijde jako brbat se levou rukou na pravý půlce, ale budiž). Chápu, že to jsou pro vás jako znalce nette blbosti, ale v nette nikdy nedělal, resp. jen v 0.8 což bylo šílený.

Prosím, jak by to bylo, pokud by to bylo řešeno přes službu?

Šaman
Člen | 2666
+
0
-

Tohle prasácký není, to je best practise. Je naprosto jasné která proměnná se kam předává.

Prasácký(*) by bylo předat celou sekci parametrů naslepo nějaké službě, ze které si to pak presenter tahá jak se mu zlíbí. Tak to mám v jednom projektu a to jsem asi někde zveřejnil u podobného dotazu.


(*) Jestli je tohle prasácký, tak je IMHO prasácká i celá Doctrine2, protože běžný (doporučený?) postup získávání entit z databáze je $this->em->getDao('Namespace\EntityClass')->…;. Každá třída, která dostane entityManager tak dostává přístup k celé databázi – najdi si tam co chceš.

Šaman
Člen | 2666
+
0
-

Co se ti na tomhle nelíbí? To je novinka v Nette 2.3 a řeší přesně tenhle problém. Psal jsem to i jako druhou možnost ve své odpovědi a tohle je ta syntaxe. Tohle by mělo zavolat setResourceSerial() na všech potomcích BasePresenteru, což je přesně to, co potřebuješ. Ale myslím, že když to David představoval, tak mluvil o tom, že to funguje jen pokud jsou ty presentery v DI kontejneru. Takže se pak musíš do sekce services vypsat třídy všech presenterů. (To je informace z vývojové verze, možná – ale spíš ne – už toto omezení neplatí.)

Dodatek: Aha, to je přesně ten důvod, ptoč ti to nefungovalo ani s HomepagePresenterem, který existuje a je instancovatelný. On není v DI kontejneru, vytváří ho PresenterFactory. Abys mohl používat nastavení presenterů v configu, musíš ty presentery vytvářet v DIC, tedy vypsat je v sekci services.

Editoval Šaman (30. 4. 2015 16:09)

Michal Vyšinský
Člen | 608
+
0
-

Setkali jsme se s tím nedávno. Všechny presentery jsou sice registrované automaticky jako služby ale dekorátory se na ně neaplikují – pravděpodobně jsou registrované až po aplikování dekorátorů.

Šaman
Člen | 2666
+
0
-

Teď jsem ti na to odpověděl jako dodatek v komentáři nad tvým. Ty presentery neexistují v DIC, proto ti nefungovalo ani přímé volání setteru.

Jarda77
Člen | 10
+
0
-

hmmm, tak nevím. Zkoušel jsem to s tím decorator. Sice to nepadá na držku, ale stejně to nefunguje. Vůbec se nic nenačte…

Kód: `abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @persistent */
public $lang;

protected $_resourceSerial;

protected function beforeRender()
{
// FIXME – stupid Nette, never works…
$this->template->resourceVersion = $this->_resourceSerial;

$this->template->lang = $this->lang;
$this->template->isRed = isset($_GET[‚red‘]) && ‚1‘ === $_GET[‚red‘];
 }

public function setResourceSerial($resourceSerial)
{
$this->_resourceSerial = $resourceSerial;
}
}`
a config: `parameters:
resourceSerial: „0.0.1“`

Jarda77
Člen | 10
+
0
-

V pohodě Šamane, zahlédl jsem někde tvůj dotaz a lidi tě tak pespsuli, že je to prasácký. Nebylo to nic na Tebe. Normálně píši v .NET, PHP je jen okrajově, když nepočítám práci v MF, kde bylo taky Nette, což byl i důvod proč jsem po 1 měsíci odešel… U SocialBakers se to opakovalo, jen jsem vydržel 3 měsíce. Doctrine2 je humus a obecně PHP je zvrácený a bez pořádného OOP. Ono na OOP v .NET / Jave nebude nidky nic moc, protože by se muselo PHP přepsat komplet. Nebo LINQ třeba. Ale to sem nepatří. O nette skoro nic nevím, dělal jsem ranných verzích, bohužel v tom potřebuji napsat jeden web a pak už v Nette zakázku nevezmu a byl bych moc rád, pokud by jste mi tady poradili

Editoval Jarda77 (1. 5. 2015 13:58)

Šaman
Člen | 2666
+
0
-

Jaká verze Nette?

Jarda77
Člen | 10
+
0
-

ta poslední, tuším 2.3.1

Jan Suchánek
Člen | 404
+
0
-

@Šaman: tzn. je lepší extension a cachovat presentery a předávat jim rovnou parametry nebo používat ty setry?

Editoval jenicek (2. 5. 2015 0:17)

Šaman
Člen | 2666
+
0
-

Teď jsem si to zkusil na čistém nette/web-projectu a funguje to v pohodě. Dal jsem to na GitHub.

Šaman
Člen | 2666
+
0
-

Nechápu na co se vlastně ptáš? Ale pokud mi bude stačit decorator, tak je podle mě psaní extension zbytečné (spíš nadbytečné – znepřehledňuje kód).
Teď jsem si to zkusil a je to luxusní – vpodstatě odpadá problém s prasárnami typu extension, která automaticky všechno injectuje, nebo psaní všech services rovnou s inject on (obojí jsem viděl na větších projektech).

Jarda77
Člen | 10
+
0
-

Super Šamane, opravdu to teď funguje. To mi stačí. Pardón, ale Nette je fakt brutální uchylárna a prasečina – registrovat presenter jako službu… :-D Fakt výsměch. Nehledě na to, že dokumetace o tomhle mlčí, uvádí se jen jakési DI extension a sám píšeš, že to je prasečina. Na druhou stranu hoši, klobouk dolů za to, že v nette humusu jste ochotni něco psát.

Michal Vyšinský
Člen | 608
+
0
-

Bylo by dobré kdybys přestal urážet něčí práci. Dokumentace není ještě zdaleka ideální ale když vidíš nějaký nedostatek, můžeš pomoci to doplnit nebo opravit – byla by to lépe vynaložená energie než tady plivat na něčí výtvor.

Editoval Michal Vyšinský (3. 5. 2015 13:15)

Šaman
Člen | 2666
+
0
-

Hodlám reagovat jen na to, že jsem údajně prohlásil, že extensions jsou prasečina. Nikoliv, toto slovo jsem použil jen ve spojení s „extension, která automaticky všechno injectuje“, což je hack. Extensions jsou dobrý nástroj na nestandardní věci, které se nedají zapsat jednodušeji.

Jarda77
Člen | 10
+
0
-

@Šaman: ne, v tom co jsem četl, tak pomlouvali oni tebe. Ne já. Jestli je pro nette nestandardní přístup do konfigurace a musím proto udělat z presenteru službu a pak to injektovat, pak to hovoří za vše…

@MichalVyšinský: sorry, ale pokud bych měl zapojit, tak leda v aktivitách PROTI nette. Má jen samý zápory: ikdyž si česká komunita PHP myslí, že je to super věc, je předem určeno k zániku, vlastně nic neumí, vše se musí obcházet, psal to Grudl. Dokumentace nikdy nebyla a ani nikdy nebude, už když jsem pracoval v Mladý Frontě ve verzi 0.8. Teď je 2.3 a s dokumentací je to skoro stejné, pokud už něco, vlastně se tam nic nedozvíš a nebo je u ní napsáno, že je článek starý. Upřímně, znám opravdu hodně PHPčkářů a nejen v ČR, ale jen češi ví co je nette. Ani jeden z 83 lidí neřekl o nette nikdy nic dobrého – jen to, že se „to“ hodí nechat umřít a vlastní server by to nikdy nedal. Vaše „úžasné“ nette je to několik let a dokumentace stojí za ho*no. To na co jsem se tu ptal, tedy přístup do konfigurace aplikace se musí řešit presenterem jako dekorátorem, ze kterého se udělá service :-D Když se mi něco nělíbí, řeknu to, ale lidi okolo nette nikdy neuměli snášet kritiku, stejně jako Grudl, kterého znám osobně. Jak jsem psal, klidne ho používejte.

David Matějka
Moderator | 6445
+
0
-

@Jarda77

vše se musí obcházet, psal to Grudl

Grudlovi bych neveril, je to prece ten prasak, co napsal nette…

Ani jeden z 83 lidí neřekl o nette nikdy nic dobrého

ja znam taky hodne PHPckaru a kazdy z 84 ma nette rad.

Filip Procházka
Moderator | 4668
+
0
-

@Jarda77

Tady už nic konstruktivního nevznikne, zamykám.