Nette\Environment::getApplication()->getPresenter() vrací NULL

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Etch
Člen | 403
+
0
-
<?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.

David Grudl
Nette Core | 8218
+
0
-

U mě to funguje.

Etch
Člen | 403
+
0
-

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
+
0
-

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
+
0
-

Podivné to rozhodně je. Zkoušel jsem to na localhostu na windows PHP 5.3.4 a na Ubuntu PHP 5.3.5 a všude stejný výsledek. Pokud to funguje u vás, tak je jasné, že je chyba někde u mě, ale nějak mě za boha nenapadá co by mohlo způsobovat toto zvláštní chování.

Jan Tvrdík
Nette guru | 2595
+
0
-

Co máš v bootstrapu?

Etch
Člen | 403
+
0
-

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;
        }
}
norbe
Backer | 405
+
0
-

Nemůže to být chybějícím lomítkem? Správně by mělo být \Nette\Diagnostics\Debugger::dump(\Nette\Environment::getApplication()); pokud nemáš v presenteru uvedeno use Nette;

Jan Tvrdík
Nette guru | 2595
+
0
-

Zabal to do archivu a někam nahraj.

Etch
Člen | 403
+
0
-

norbe napsal(a):

Nemůže to být chybějícím lomítkem?

Lomítko na to nemá vliv.

Editoval Etch (24. 5. 2011 1:43)

bojovyletoun
Člen | 667
+
0
-

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)

arron
Člen | 464
+
0
-

Tohle je ovsem luxusni WTF :-D

Ondřej Mirtes
Člen | 1536
+
0
-

Nojono, to je kvůli tomu, že Environment::getConfigurator() bere vždy posledně vytvořenou instanci Configuratoru.

David Grudl
Nette Core | 8218
+
0
-

Tomu právě mělo to $instance zabránit…

Etch
Člen | 403
+
0
-

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í.

dakota
Člen | 148
+
0
-

V prípade ak sa má režim detekovať, tak Configurator sa v Environment inštancuje už pri Debugger::enable().

Debugger::enable(); // inštancia Configuratora v Environment, Debugger riadok 216
$configurator = new Nette\Configurator; // rozdielna inštancia Configuratora
edke
Člen | 198
+
0
-

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.