Bootstrap je „nekomutativní“ ⇒ není to chyba?

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

Problém v 2.0 Beta

Mám config.ini ve tvaru:

[common]
; PHP configuration
php.date.timezone = "Europe/Prague"

services.robotLoader.option.directory[] = %appDir%
services.robotLoader.option.directory[] = %libsDir%
services.robotLoader.run = TRUE

services.authenticator = Uzivatele
services.authorizator  = Acl

popisky.Subjekt = "SEKK"

tabulky.Uzivatele   = Ency_Uzivatele
tabulky.Log         = Ency_Log
tabulky.Logs        = Ency_Log

[production < common]

db.server = localhost
db.database =
db.username =
db.password =
db.driver = mysql
db.charset = utf8
db.lazy = TRUE

[development < common]

db.server = localhost
db.database =
db.username =
db.password =
db.driver = mysql
db.charset = utf8
db.lazy = TRUE

Když použiju bootstrap podle sandboxu

use Nette\Diagnostics\Debugger,
	Nette\Application\Routers\SimpleRouter,
	Nette\Application\Routers\Route;


// Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';


// 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.ini');


// Configure application
Debugger::dump(\Nette\Environment::getContext()->params);
die();

$application = $configurator->container->application;
$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;


// Setup router
...

tak dostanu

Nette\ArrayHash(5) {
   "appDir" => "D:\Php\Projekty\Enclabmed.cz\app" (32)
   "libsDir" => "D:\Php\Projekty\Enclabmed.cz\libs" (33)
   "tempDir" => "D:\Php\Projekty\Enclabmed.cz\temp" (33)
   "productionMode" => FALSE
   "consoleMode" => FALSE
}

Jestliže, ale prohodím řádky

use Nette\Diagnostics\Debugger,
	Nette\Application\Routers\SimpleRouter,
	Nette\Application\Routers\Route;


// Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';


// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$configurator->loadConfig(__DIR__ . '/config.ini');


// Enable Nette\Debug for error visualisation & logging
Debugger::$strictMode = TRUE;
Debugger::enable();


// Configure application
Debugger::dump(\Nette\Environment::getContext()->params);
die();

$application = $configurator->container->application;
$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;


// Setup router

dostanu (což chci a čekám)

Nette\ArrayHash(12) {
   "appDir" => "D:\Php\Projekty\Enclabmed.cz\app" (32)
   "libsDir" => "D:\Php\Projekty\Enclabmed.cz\libs" (33)
   "tempDir" => "D:\Php\Projekty\Enclabmed.cz\temp" (33)
   "productionMode" => FALSE
   "consoleMode" => FALSE
   "popisky" => Nette\ArrayHash(1) {
      "Subjekt" => "SEKK" (4)
   }
   "tabulky" => Nette\ArrayHash(3) {
      "Uzivatele" => "Ency_Uzivatele" (14)
      "Log" => "Ency_Log" (8)
      "Logs" => "Ency_Log" (8)
   }
}

Není to chyba v Nette?

bojovyletoun
Člen | 667
+
0
-

Taky jsi nám mohl prozradit, kteréž řádky jsi prohodil a ušetřit 5 minut hledání.

Chyba je v tom, že ty si vytvoříš Configurator(který o Environmentu nemusí vědět) a potom v aplikaci používáš Environment. Buď používej Environment::getConfigurator()(což je deprecated, Environment bude zničen) a nebo místo \Nette\Environment::getContext()->params používej container – v tomto místě $configurator->context ,jinde třeba $this->context

podrobně zde https://forum.nette.org/…r-vraci-null

smi
Člen | 75
+
0
-

bojovyletoun napsal(a):

Taky jsi nám mohl prozradit, kteréž řádky jsi prohodil a ušetřit 5 minut hledání.

Chyba je v tom, že ty si vytvoříš Configurator(který o Environmentu nemusí vědět) a potom v aplikaci používáš Environment. Buď používej Environment::getConfigurator()(což je deprecated, Environment bude zničen) a nebo místo \Nette\Environment::getContext()->params používej container – v tomto místě $configurator->context ,jinde třeba $this->context

podrobně zde https://forum.nette.org/…r-vraci-null

Tady je problém v modelech, kde si potřebuji dotáhnout údaje a nelze je vzít z prezenteru. (V construktoru si je v případě autentizace a autorizace neumím podat – nevím, kde se modely volají)

Za ty neoznačené řádky se omlouvám.

Editoval smi (7. 6. 2011 13:45)

Teyras
Člen | 81
+
0
-

Pokud to chceš prostě nějak vyřešit, přidej si do boostrapu ještě

<?php
Environment::setConfigurator($configurator);
Environment::setContext($configurator->container);
?>

Samozřejmě asi nemusím zdůrazňovat, že je to prasárna :) Jak už se tu psalo, problém je v tom, že Debug si „inicializuje“ Environment…