ErrorPresenter: BadRequestException přesměruje jen 1×, pak NotImplementedException

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

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

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

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

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

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)

_Martin_
Generous Backer | 679
+
0
-

A tam v sekci Caused by ti to píše: „A session had already been started by session.auto-start or session_start().“ – že bys měl v konfiguraci zaplý auto-start session?

Michalek
Člen | 211
+
0
-

php.ini

; Initialize session on request startup.
session.auto_start = 0
forkman
Člen | 72
+
0
-

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?

phx
Člen | 651
+
0
-

Narazil jsem na neco podobneho, kdyz jsem do Identity daval jako $data objekt (Ormion) a ne pole.

forkman
Člen | 72
+
0
-

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

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

rixi
Člen | 109
+
0
-

Len tak mimochodom, v sandboxu, v ErrorPresenteru nechyba v riadku 36 tento kod?

<?php
Debug::log($exception, Debug::ERROR);
?>

Ked sa vyhodnoti chyba 403, 404, 405, 410 tak mi to chyby neloguje a neemailuje. Pokial vsak nepouzijem ErrorPresenter, tak to funguje.

Ondřej Mirtes
Člen | 1536
+
0
-

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.

norbe
Backer | 405
+
0
-

Přesně jak píše Ondra, já osobně bych nepovažoval za užitečné aby mi přicházeli emaily o tom, že někdo zadal adresu, která neexistuje…

rixi
Člen | 109
+
0
-

Jasne, chybicka sa vludila u mna. Povodne som si myslel ze, ked sa nepouzije ErrorPresenter, tak Nette loguje aj 404 chyby napriklad. Tak som chcel to logovanie zjednotit aj s ErrorPresenterom v sandboxu. No uz som zistil, ze to vlastne zjednotene bolo :)