Nette\Environment::getApplication()->getPresenter() vrací NULL
- Etch
- Člen | 403
<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter{
public function startup(){
parent::startup();
\Nette\Diagnostics\Debugger::dump($this->getPresenter());
\Nette\Diagnostics\Debugger::dump(Nette\Environment::getApplication()->getPresenter());
}
}
?>
První dump vrací správně presenter;
Druhý dump vrací NULL
Je toto standardní chování? Vrátil jsem se po roce k nette a tohle mě trochu překvapilo, ale předpokládám, že je to jen nějaká moje blbost.
Předem děkuji.
- Etch
- Člen | 403
Pokud použiji verzi 2.0 Alpha 2 tak vše funguje normálně, ale když použiji 2.0-dev tak mi vždy vrátí NULL.
$this->getApplication()
vrací
Nette\Application\Application(11) {
"catchExceptions" => FALSE
"errorPresenter" => "Error" (5)
"onStartup" => array(1) [
0 => Closure(1) {
"0" => Closure(1) { *RECURSION* }
}
]
"onShutdown" => NULL
"onRequest" => NULL
"onResponse" => NULL
"onError" => NULL
"allowedMethods" => array(5) { ... }
"requests" private => array(1) [
0 => Nette\Application\Request(7) {
"method" private => "GET" (3)
"flags" private => array(1) { ... }
"name" private => "Homepage" (8)
"params" private => array(2) { ... }
"post" private => array(0)
"files" private => array(0)
"frozen" private => TRUE
}
]
"presenter" private => HomepagePresenter(27) { ... }
"..." => "..."
}
ale \Nette\Environment::getApplication()
vrací
Nette\Application\Application(11) {
"catchExceptions" => FALSE
"errorPresenter" => NULL
"onStartup" => NULL
"onShutdown" => NULL
"onRequest" => NULL
"onResponse" => NULL
"onError" => NULL
"allowedMethods" => array(5) { ... }
"requests" private => array(0)
"presenter" private => NULL
"..." => "..."
}
Použit je klasický sandbox pouze doplněn o dvě řádky v BasePresenteru, ale pokud to tobě funguje normálně, tak je problém někde u mě mezi židlí a klávesnicí. Nějak se v tom ještě pohrabu.
- bojovyletoun
- Člen | 667
Podivný problém… ale mě to funguje ok v obou verzích (aktuální 17.5 a stará, kde byly ještě staré namespace). Jinak tedy jsem přepisoval namespaces a byl to docela porod, ale asi je to o zvyku. Co teprv přepisování doplňků…
Nette\Environment::getApplication()==$this->getApplication() TRUE
- Etch
- Člen | 403
Je to sandbox z distribuce, který není nijak upravovaný. Ani bootstrap,
ani config, prostě nic. Upraven je pouze BasePresenter
a to
následovně:
abstract class BasePresenter extends Nette\Application\UI\Presenter{
public function startup(){
parent::startup();
\Nette\Diagnostics\Debugger::dump($this->getApplication());
\Nette\Diagnostics\Debugger::dump(Nette\Environment::getApplication());
exit;
}
}
- bojovyletoun
- Člen | 667
Sherlock Holmes to našel po usilovném hledání. Může za to tohle v bootstrapu.(Pro informaci – pokud řádky prohodíte, „tak“ bude platit ten poslední). Otázku jsem trochu rozšířil.
$configurator=Nette\Environment::getConfigurator(); //takhle to bude fungovat (*1)
$configurator = new Nette\Configurator; //tohle tam máš (*2)
v bootstrapu nadále používaš proměnnou configurator (dle pravidel DI
:)), a aplikace je spuštěna skrze
$configurator->application->run()
.
To znamená, že běžící aplikace včetně běžícího presenteru je
v containeru (*2). Pokud zavoláš
Env::getcontext()->application
, tak si Environment vytvoří
svůji instanci configuratoru a v něm instanci contextu(containeru)
(Nevím jestli nový configurator, ale container ano, protože z těch
static, self a $instance mi jde hlava kolem – k tomu by měl být
manuál). A vněm žádná application není spuštěna (žádné run
nebylo na ní voláno) Pozn- ani tam neběží žádná jiná služba.
Opačně to fungovat bude, protože se „živý kontext“ dostane i do Environmentu-
Takže vlastně je otázka, jak se ti do bootsrapu dostal takováhle chyba (nemyšleno kriticky) a vlastně jsi chtěl získat presenter z globálního kontextu, kde aplikace (ani jiná služba) vůbec neběžela.
Editoval bojovyletoun (19. 5. 2011 12:35)
- Ondřej Mirtes
- Člen | 1536
Nojono, to je kvůli tomu, že Environment::getConfigurator()
bere vždy posledně vytvořenou instanci Configuratoru.
- Etch
- Člen | 403
bojovyletoun napsal(a):
Sherlock Holmes to našel po usilovném hledání.
Dík za osvětlení problému.
bojovyletoun napsal(a):
Takže vlastně je otázka, jak se ti do bootsrapu dostal takováhle chyba (nemyšleno kriticky) a vlastně jsi chtěl získat presenter z globálního kontextu, kde aplikace (ani jiná služba) vůbec neběžela.
Ono je to dost způsobené tím, že jsem se vrátil k nette po roce a za
ten rok jsem bohužel neměl příliš času sledovat dění okolo nette. Dosti
se toho změnilo a tahle situace vznikla při přípravě výchozích souborů
pro následný vývoj ( natahování různých debug panelů, základní
konfigurace db atd.). V debug panelech se právě
Nette\Environment::getApplication()->getPresenter()
občas
používá, takže okamžitě začaly lítat výjimky. Ten rok bez nette mě,
v určitých směrech, pasoval znovu do role začátečníka a já si v tu
chvíli prostě nedokázal vysvětlit proč tato situace nastává. To, že bude
chyba u mě, mezi židlí a klávesnicí, jsem tušil hned na začátku a
právě proto byl tento topic původně v sekci fóra „Nette\Application“,
ale nějaký moderátor ho přesunul sem do sekce hlášení chyb.
Každopádně opravdu dík za nakopnutí.
- edke
- Člen | 198
Mozno to poriesit aj tak, ze „umravnime“ Environment (ak ho pouzivas) a to hned po inicializacii Configuratora, kedze Environment si vytvara vlastny context a Configurator este predtym vdaka Debugger::enable();
// Enable Nette\Debug for error visualisation & logging
Debugger::$strictMode = TRUE;
Debugger::enable();
// Load configuration from config.neon file
$configurator = new \Nette\Configurator();
$configurator->loadConfig(__DIR__ . '/config.neon');
\Nette\Environment::setConfigurator($configurator);
\Nette\Environment::setContext($configurator->container);
Dalo by sa to aj poriesit tak, ze posunieme Debugger::enable() za $configurator, tym ale riskujeme to, ze ladenka nezachyti problemy pri spracovani configu. Takze este to nie je idealne, pokial Debugger je zavisly na Environment-e, v nom sa vytvori „zbytocny“ Configurator, ktory potom treba prepisat.