ErrorPresenter
- Tomik
- Nette Evangelist | 485
Zdravím diskutijící!
Nevím, zda to je bug, nebo chyba u mě, takže to píšu do obecné diskuse a
ne do bug reportu. ;)
Každopádně, mám nastaven $application->errorPresenter = ‚Error‘;, a v config.ini mám (provizorně, abych vyzkoušel, jak ErrorPresenter funguje) pro všechna prostředí mode.live = TRUE.
V normálním presenteru, pokud není nalezena položka, kterou chci zobrazit vyhodím BadRequestException a pak se stane, že v Application.php se na tomto místě: https://api.nette.org/…ion.php.html#197
se to dostane až k tomuto kódu elseif ($this->errorPresenter), který je vyhodnocen kladně, takže bych předpokládal, že dojde k reguestu na ErrorPresenter, ale ten se vůbec nedostane ke slovu a vypíše se to echo s chybou 500, co je pod těmi podmínkami:
<?php
echo "<title>500 Internal Server Error</title>\n\n<h1>Server Error</h1>\n\n", "<p>The server encountered an internal error and was unable to complete your request. Please try again later.</p>";
?>
Co dělám špatně? :)
Díky!
- romansklenar
- Člen | 655
Došlo ti tam k chybě při spouštění ErrorPresenteru
.
Musíš nahodit laděnku (pokud loguješ, mrkni do logu na Exepšny) a podívat
na část ‚Caused-By‘ tušímže a tam najdeš přesně výjimku, kvůli
které ti to nejde.
- Tomik
- Nette Evangelist | 485
romansklenar napsal(a):
Došlo ti tam k chybě při spouštění
ErrorPresenteru
. Musíš nahodit laděnku (pokud loguješ, mrkni do logu na Exepšny) a podívat na část ‚Caused-By‘ tušímže a tam najdeš přesně výjimku, kvůli které ti to nejde.
To je právě divný, protože Laděnka je zapnutá, pokud ji nechám logovat, log je prázdný a defaulně ji pouštím do fireBugu a ten taky mlčí… Tak nevím.
- Tomik
- Nette Evangelist | 485
romansklenar napsal(a):
Došlo ti tam k chybě při spouštění
ErrorPresenteru
. Musíš nahodit laděnku (pokud loguješ, mrkni do logu na Exepšny) a podívat na část ‚Caused-By‘ tušímže a tam najdeš přesně výjimku, kvůli které ti to nejde.
A pokud pustím ErrorPresenter ručně – tedy pustím jej normálně přes request a předám mu jako výjimku BadRequestException, potom funguje normálně, to je o důvod víc, proč se domnívat, že chyba není v něm. Resp. ten error presenter má takovýto kód:
<?php
class ErrorPresenter extends BasePresenter
{
public function renderDefault($exception)
{
if ($this->isAjax()) {
$this->payload->error = $exception->getMessage();
$this->terminate();
} else {
$this->template->robots = 'noindex,noarchive';
if ($exception instanceof /*Nette\Application\*/BadRequestException) {
Environment::getHttpResponse()->setCode(404);
$this->template->title = '404 Not Found';
$this->changeView('404');
} else {
Environment::getHttpResponse()->setCode(500);
$this->template->title = '500 Internal Server Error';
$this->changeView('500');
/*Nette\*/Debug::processException($exception);
}
}
}
}
?>
Je tam chyba? A pokud ne, kde jinde by mohla být chyba?
Díky za pomoc!
- Tomik
- Nette Evangelist | 485
PetrP napsal(a):
Podíval bych se jestli není problém v
BasePresenter
u vyskoušel bych co se stane kdyz budu dědit přímo odPresenter
.
Díky! Pomohlo. bylo to způsobené tím, že jsem měl v BasePresenteru
Environment::getSession()->start();
, nevím, proč to tam
vadilo, ale už to tam není, funguje to i bez toho a funguje
i ErrorPresenter, takže díky moc!
- David Grudl
- Nette Core | 8218
Session není možné startovat dvakrát (tedy je, ale musí se předtím
manuálně uzavřít). Tudíž bych $session->start()
změnil
třeba na if (!$session->isStarted()) $session->start();