Nette Context bug, dva kolidujici kontexty: Environment Context, App Context
- mcmatak
- Člen | 499
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
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
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
Čá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
Odkazujte se všude na
Environment::getApplication()->getContext()
. Funguje nám
to.
- Patrik Votoček
- Člen | 2221
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…