Načtení hodnot z konfigu :-(
- Jarda77
- Člen | 10
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.
- Šaman
- Člen | 2659
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
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
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
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 | 2659
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 | 2659
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
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ů.
- Jarda77
- Člen | 10
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
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)
- Jan Suchánek
- Člen | 404
@Šaman: tzn. je lepší extension a cachovat presentery a předávat jim rovnou parametry nebo používat ty setry?
- Extension: http://tinyurl.com/pfrfjtc
- config.neon: http://tinyurl.com/l3kv4s3
Editoval jenicek (2. 5. 2015 0:17)
- Šaman
- Člen | 2659
Teď jsem si to zkusil na čistém nette/web-project
u a funguje
to v pohodě. Dal
jsem to na GitHub.
- Šaman
- Člen | 2659
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
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
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 | 2659
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
@Š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
@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.