ErrorPresenter: BadRequestException přesměruje jen 1×, pak NotImplementedException
- Michalek
- Člen | 211
Zdravím, mám zvláštní problém a neumím ho vyřešit.
Při /clanek/1-seo/ zkusím vybrat článek s ID 1 – když neexistuje,
logicky
vyhodím throw new BadRequestException('Článek nebyl nalezen.', 404);
Poprvé je to ok, přesměruje to správně na Error_DefaultPresenter (mám to v modulech) a zobrazí šablonu 404. Když ale dám F5, objeví se NotImplementedException a přestane fungovat celý web, protože to pak hází úplně všude (musím smazat cookies PHPSESSID, aby to začalo fungovat).
Zvláštní je, že pokud zadávám /neexistujici-adresa/ funguje to stále správně a zobrazuje se pořád šablona 404 a web funguje.
http://error.safus.cz/…08_9140.html
Vypadá to na nějaký problém někde, nevím kde. Tušíte někdo? Když Error presenter nechci používat, všechno samozřejmě funguje jak má. Díky.
config.ini
service.Nette-Application-Application = "BaseApplication"
bootstrap.php
<?php require LIBS_DIR . '/nette/loader.php' ;
Debug::enable(Debug::PRODUCTION, '!!_log/php_error.log');
Debug::enableProfiler() ;
Environment::loadConfig() ;
if(!Environment::getSession()->isStarted())
{
Environment::getSession()->start() ;
}
$application = Environment::getApplication() ;
$application->onStartup[] = 'BaseModel::connect' ;
$application->onShutdown[] = 'BaseModel::disconnect' ;
$application->errorPresenter = 'Error:Default';
$application->catchExceptions = true;
RoutingDebugger::enable() ;
$application->run() ;
část BaseApplication.php
public function run()
{
$this->cache = Environment::getCache('Nette.Application');
$this->permission = new Permission;
$this->user = Environment::getUser();
$this->navigationMain = new Navigation;
$this->navigationAdmin = new Navigation;
$modules = Environment::getConfig('modules');
foreach($modules as $module) $this->loadModule($module);
$this->setupRouter();
$this->setupNavigationMain();
$this->setupNavigationAdmin();
$this->setupPermission();
parent::run();
$this->cache->release() ;
}
Editoval Michalek (23. 12. 2009 20:32)
- Michalek
- Člen | 211
Aha, tak už jsem našel, že při další aktualizaci stránky to skončí
na startování session a hlásí to hlášku
A session had already been started by session.auto-start or session_start().
–
takže při ErrorPresenteru někde startují session aniž bych to chtěl.
EDIT: Záhada zůstává, nicméně v příspěvku https://forum.nette.org/…oductionmode#… jsem objevil stejný problém, odstranil jsem z wakeup vyhazování podmínky a funguje to. Nechválím se za to řešení.
Editoval Michalek (23. 12. 2009 21:49)
- David Grudl
- Nette Core | 8229
Odkaz na Laděnku je fajn, ale s minified verzí frameworku se jen těžko pozná, kdo tu výjimku vyhazuje. Každopádně vypádá to na deserializaci komponenty, což zatím není implementované. Nedáváš třeba nějaké komponenty do session?
- Michalek
- Člen | 211
Osobně se session nedělám vůbec nic, mám je jenom kvůli loginu, myslím.
Exception z full Nette. Nejsem si jistý, jestli to pomůže :)
http://error.safus.cz/…39_6328.html
Editoval Michalek (24. 12. 2009 1:58)
- Michalek
- Člen | 211
Pokud odstraním Environment::getSession()->start();
dostanu
se k výjimce http://error.safus.cz/…56_3671.html
Editoval Michalek (24. 12. 2009 2:27)
- forkman
- Člen | 72
Nevím, jestli dělám dobře, když oživuju starší téma, ale mám stejný problém s ErrorPresenterem, po zachycení BadRequestException mi „něco“ uloží do session dump té výjimky a potom už aplikace nefunguje, kvůli nepodporovanému obsahu session. Je v ní prostě „Stack trace #1 …“. dělá mi to i s nejnovější verzí. Nevíte někdo prosím jak se toho zbavit?
- forkman
- Člen | 72
To jsem zkontroloval, ukládám tam pole, ale dovolil jsem si přiložit kousek obsahu ze session:
"exception 'BadRequestException' with message 'Produkt nenalezen' in /data/web/podkovy.mi-ma.cz/app/FrontModule/presenters/PolozkyPresenter.php:250
Stack trace:
#0 [internal function]: Front_PolozkyPresenter->actionDetail('3')
#1 /data/web/podkovy.mi-ma.cz/libs/Nette/Reflection/MethodReflection.php(77): ReflectionMethod->invokeArgs(Object(Front_PolozkyPresenter), Array)
#2 /data/web/podkovy.mi-ma.cz/libs/Nette/Application/PresenterComponent.php(95): MethodReflection->invokeNamedArgs(Object(Front_PolozkyPresenter), Array)
#3 /data/web/podkovy.mi-ma.cz/libs/Nette/Application/Presenter.php(160): PresenterComponent->tryCall('actiondetail', Array)
#4 /data/web/podkovy.mi-ma.cz/libs/Nette/Application/Application.php(148): Presenter->run(Object(PresenterRequest))
#5 /data/web/podkovy.mi-ma.cz/app/bootstrap.php(119): Application->run()
#6 /data/web/podkovy.mi-ma.cz/index.php(22): require('/data/web/podko...')
#7 {main}";s:7:"
- LeonardoCA
- Člen | 296
Možná to někomu pomůže a ušetří čas, protože mi trvalo asi 2 hodiny než jsem příšel na řešení tohoto problému na svém projektu.
Ať jsem hledal tady na fóru jakkoli, tak jsem našel jen informaci o tom, že chyba souvisí se session a inicializací komponentů. V samotném error presenteru jsem žádné komponenty neinicializoval, až mi to došlo:
V mém případě šlo o inicializaci login formuláře, který se zobrazuje na každé stránce, proto jsem ho dal do Base prezenteru.
Error presenter jsem dědil od (mého vlastního) Base presenteru – který obsahoval při volání parent::BeforeRender inicializaci komponenty. Proto jsem ErrorPresenter nechal dědit od Presenter a do beforeRender jsem si přidal jen nejnutnější věci potřebné pro správné generování @layout šablony.
Není to nejčistší řešení a pořád ještě nerozumím proč přesně k chybě dochází, ale na tomto konkrétním malém projektu to bylo nejrychlejší a nejjednoduší řešení.
Shrnuto: Bacha na to od čeho a co ErrorPresenter dědí.
- Ondřej Mirtes
- Člen | 1536
To záleží na osobních preferencích každého. Pokud chceš, aby ti přišel e-mail o každém přístupu na nenalezenou stránku, ten řádek si tam přidej.