Nette Context bug, dva kolidujici kontexty: Environment Context, App Context

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

Tak se snažím nějak přecházet v rámci některých projektů na nette 2.0, určitě může být chyba na mé straně, ale přijde mi, že je chyba v návrhu contextů.

Existuje jak Environment kontext a to je např. volání IAuthenticator service z objektu User

které se volá na kontextu Environment,

<?php
Environment::getContext()->getService('Nette\Security\IAuthenticator');
?>

tedy pokud chci zaměnit IAuthenticator, pak to udělám nějak takto v bootstrapu

<?php
Environment::getContext()->addService('Nette\Security\IAuthenticator', "System\Security\Authenticator");
?>

nicméně v presenteru volání getUser mi šahá na application context

return $this->context->getService(‚Nette\\Web\\IUser‘);

takže změnu user service musím v bootstrapu provést takto

<?php
$application->getContext()->addService('Nette\Web\IUser', "System\Security\User");
?>

což je samo o sobě matoucí, nicméně fičura nette 2.0 a to přenos usera do šablony opět volá environment context

<?php
$template->user = Nette\Environment::getUser();
?>

takže se vlastně nikdy ty service nesejdou :)

buď jsem blbej nebo context je nedotažený koncept :( což je škoda protože neopravuj co funguje se prej říká (alespoň dokud to není promyšlené)

Editoval mcmatak (10. 3. 2011 17:40)

Jan Tvrdík
Nette guru | 2595
+
0
-

Kontext se skutečně v současnosti klonuje. Důvod mi není znám. IMHO by celá aplikace měla používat kontext aplikace, ale z důvodu nedotaženosti to tak bohužel v současné době není.

Honza Marek
Člen | 1664
+
0
-

Dával jsem na odstranění toho problému pull request, ale byl mi zamítnut, že prý je to takhle lepší nebo co.

Filip Procházka
Moderator | 4668
+
0
-

Částečně to řeší včasná registrace služeb už v configu.

Ale souhlasím, že je to maximálně matoucí. Částečně mi příjde logické že prostředí (environment) má jiný kontext než aplikace (application) samotná, ale dokud to není dotažené (kompletní DI v celém Nette + následné využívání správného(=z běžícího application) kontextu ve všech službách, které využívá application) tak je to docela problém.

Ondřej Mirtes
Člen | 1536
+
0
-

Odkazujte se všude na Environment::getApplication()->getContext(). Funguje nám to.

mcmatak
Člen | 499
+
0
-

jde spíš o to, že samotné nette si neumí vybrat context a skáče mezi contexty, nakonec to validuje viz příklad s userem v šabloně a userem v presenteru, jde o jiné usery !!!

Patrik Votoček
Člen | 2221
+
0
-

Tenhle „bug“ sem fixnul zároveň s https://github.com/…tte/pull/199 ale bylo mi řečeno že tvorba a plnění šablon základními daty se bude refaktorovat a vyřeší se to…