Zobrazení vlastní 500 šablony nejde přes error presenter
- tkotasek
- Člen | 15
Zdravím a chci se zeptat, zda se někomu v Nette 3.0 nebo 3.1 podařilo rozjet zobrazení vlastní chybové stránky 500.
Mi se to tedy povedlo po dvou dnech zkoumání jen přes config sekce tracy, ale nepřijde mi to jako optimální varianta, když v ErrorPresenteru je callback s require souboru, který nenačte.
Mám projekt na Nette 3.1, ale i když si vezmu čisté zdrojaky z dokumentace „začínáme“ je to stejné.
composer create-project nette/web-project nette-blog
nebo
composer create-project nette/sandbox
Config.neon mám default:
application:
catchExceptions: yes (nebo true)
errorPresenter: Error
Struktura výchozí, ErrorPresentery výchozí, vypnutý debug mod.
Chyba 404 projde v pohodě přes ErrorPresenter do Error404Presenter, načte se 404.latte
Pro test chyby 500, nastavím špatné připojení DB ale na moji 500.phtml
to nikdy nepropadne.
Jediná varianta jak dostat svou 500 stránku je nastavit v configu
tracy:
errorTemplate: .../500.phtml
Pokud toto nenastavím, načte se 500.phtml přes Tracy\Debugger\Debugger.php line 333 když existují i neexistují jakékoliv ErrorPresentery.
require self::$errorTemplate ?: __DIR__ . '/assets/error.500.phtml';
uvnitř funkce
public static function exceptionHandler(\Throwable $exception): void
Když jsem zkoušel co vrací Callbacky v ErrorPresenteru dostanu
u 404
object(Nette\Application\Responses\ForwardResponse)#407 (1) {
["request":"Nette\Application\Responses\ForwardResponse":private]=>
object(Nette\Application\Request)#408 (6) {
u 500
object(Nette\Application\Responses\CallbackResponse)#28 (1) {
["callback":"Nette\Application\Responses\CallbackResponse":private]=>
object(Closure)#29 (2) {
Otázka zní.. Co dělám špatně, že mi ErrorPresenter nenačte šablonu 500.phtml :)
- Michal Kumžák
- Člen | 106
Tak sem to teď ozkoušel a udělal sem tuto změnu v ErrorPresenteru, aby mi chyby fungovaly
$this->template->setFile(__DIR__ . '/../templates/Error/' . $code . '.latte');
//$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx');
Řádek se setView nefungoval, nevím proč, a ani nevím jak má fungovat, tak sem ho nahradil rádkem nad a už to fungovalo vše správně.
- tkotasek
- Člen | 15
Pokud zapnu debug, vyskočí laděnka v sekci Call Stack je sekce
níže.
Do nette log adresáře nic.
Snažil jsem se trasovat jak to prochází skrz inicializaci. Pokud to jde na chybu 404, dojde to bez problémů na ErrorPresenter a pak na Error4xxPresenter, ale při 500 prostě ne.
Fakt netuším.
.../vendor/dibi/dibi/src/Dibi/Connection.php:147 Dibi\Drivers\MySqliDriver->__construct ()
.../vendor/dibi/dibi/src/Dibi/Connection.php:233 Dibi\Connection->connect ()
.../vendor/dibi/dibi/src/Dibi/Connection.php:221 Dibi\Connection->translate ()
.../vendor/dibi/dibi/src/Dibi/Fluent.php:388 Dibi\Connection->query ()
.../vendor/dibi/dibi/src/Dibi/Fluent.php:337 Dibi\Fluent->query ()
/var/www/html/app/Models/RoutesModel.php:20 Dibi\Fluent->fetchAll ()
.../www/html/app/router/RouterFactory.php:19 App\Model\RoutesModel->getAllRoutes ()
.../Container_0b5e0d6a30.php:579 App\Router\RouterFactory::createRouter ()
.../vendor/nette/di/src/DI/Container.php:210 Container_0b5e0d6a30->createService01 ()
.../vendor/nette/di/src/DI/Container.php:126 Nette\DI\Container->createService ()
.../Container_0b5e0d6a30.php:1745 Nette\DI\Container->getService ()
.../vendor/nette/di/src/DI/Container.php:210 Container_0b5e0d6a30->createServiceTranslation__localeResolverRouter ()
.../vendor/nette/di/src/DI/Container.php:126 Nette\DI\Container->createService ()
.../Container_0b5e0d6a30.php:1752 Nette\DI\Container->getService ()
.../vendor/nette/di/src/DI/Container.php:210 Container_0b5e0d6a30->createServiceTranslation__tracyPanel ()
.../vendor/nette/di/src/DI/Container.php:126 Nette\DI\Container->createService ()
.../Container_0b5e0d6a30.php:1832 Nette\DI\Container->getService ()
.../bootstrap/src/Bootstrap/Configurator.php:257 Container_0b5e0d6a30->initialize ()
/var/www/html/public/index.php:23 Nette\Bootstrap\Configurator->createContainer ()