Nefungující errorPresenter

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

Dobrý den,
už googlím nějaký ten čas a všude se řeší složité struktury a nemůžu najít, jak rozchodit můj error presenter. Mám verzi 2.1.1 a chtěl bych aby při erroru 404 se načetlo 404 latte a při ostatních errorech 500 latte.

Můžete my někdo říci co opravit, aby mě to takto fungovalo?

Adresářová struktura je app/model, app/presenter (/Front_ErrorPresenter) a app/templates
(/error/404.latte a /error/500.latte)

Můj error presenter (klasika):

class Front_ErrorPresenter extends BasePresenter
{

    public function renderDefault($exception)
    {
        if ($this->isAjax()) { // AJAX request? Just note this error in payload.
            $this->payload->error = TRUE;
            $this->terminate();

        } elseif ($exception instanceof BadRequestException) {
            $this->setView('404'); // load template 404.phtml

        } else {
            $this->setView('500'); // load template 500.phtml
        }
    }
}

Můj bootstrap:

use Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;


// Load Nette Framework or autoloader generated by Composer
require __DIR__ . '/../vendor/autoload.php';

// Configure application
$configurator = new Nette\Configurator;

// Enable Nette Debugger for error visualisation & logging
//$configurator->setDebugMode(TRUE);
$configurator->enableDebugger(__DIR__ . '/../log');

// Enable RobotLoader - this will load all classes automatically
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config.neon');
$container = $configurator->createContainer();

// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
	$router = $container->getService('router');
	$router[] = new Route('index.php', 'Dashboard:default', Route::ONE_WAY);
	$router[] = new Route('<presenter>/<action>[/<id>]', 'Dashboard:default');

} else {
	$container->addService('router', new SimpleRouter('Dashboard:default'));
}

return $container;

Můj neon:

php:
  date.timezone: Europe/Prague

nette:
  application:
    errorPresenter: Front:Error
    mapping:
      *: App\*Module\Presenters\*Presenter

  database:
    default:
      dsn: 'mysql:host=127.0.0.1;dbname=webtrener'
      user: root
      password:

  session:
    expiration: 14 days

services:
  - App\Model\Authenticator
  - App\Model\Users
  - App\Model\Database
  - App\Model\Calendar
  - App\Model\Stats
  - App\Model\Sharing
  - App\Model\Training

Editoval zdrhal (10. 7. 2014 13:18)

Jan Endel
Člen | 1016
+
0
-

Tohle by mělo být výchozí chování, co se ti teď stane při 404/500 ?

zdrhal
Člen | 42
+
0
-

Skočí klasická chyba pomocí laděnky (červený okno).

Např. pokud vyvolám chybu, že zadám chybné url (me_url/dashboard/kolo) → dasboardPresnter nema renderKolo, proste chybná url, která vrací 404 a proto chci načíst error/404.latte

Ale to se nestane a načte se červené okno laděnky

Nette\Application\BadRequestException #404

Page not found. Missing template '…\data\localweb\webtrener\app\templates\Dashboard\kolo.latte'

Editoval zdrhal (10. 7. 2014 13:36)

jiri.pudil
Nette Blogger | 1034
+
+1
-

Error presenter by imo měl taky respektovat mapping, tzn. App\FrontModule\Presenters\ErrorPresenter

Michal Vyšinský
Člen | 608
+
0
-

Na localhostu (resp. se zapnutým debug modem vyskočí vždy laděnka) na production by se ti měla zobrazit stránka 404.

zdrhal
Člen | 42
+
0
-

Takže ho v tom neonu můžu smazat? :)

zdrhal
Člen | 42
+
0
-

Aha a nelze ten produkční mód simulovat na lokálu? :)

EDIT: Mám to jako bakalářskou práci a pokud tomu co testuje můj program bude vyskakovat červené okno, tak asi nebude ze mě dvakrát nadšený. A vysvětlovat mu, že to na ostrém serveru pošlape, jen na lokálu to není vidět. Myslím, že mě vytahá za uši. :-D

Editoval zdrhal (10. 7. 2014 13:44)

jiri.pudil
Nette Blogger | 1034
+
0
-

Error presenter? Ne. Musíš tu třídu přejmenovat a přesunout do příslušného namespace.

A ad laděnka – pokud chceš vyzkoušet error presenter na locale, nastav v neonu ještě

nette:
	application:
		catchExceptions: yes
Michal Vyšinský
Člen | 608
+
0
-

Jak máš v bootstrap.php zakomentované setDEbugMode(TRUE) tak to odkomentuj a nastav na FALSE

Editoval Michal Vyšinský (10. 7. 2014 13:46)

zdrhal
Člen | 42
+
0
-

Ok vyzkouším děkuji za radu.

zdrhal
Člen | 42
+
0
-

Á debug mode vyplý, super díky. Akorát furt mě to nepřesměrovává, nicméně už nemám červené okno ale klasickou hlášku.* Server Error

We're sorry! The server encountered an internal error and was unable to complete your request. Please try again later.

error 500*

Michal Vyšinský
Člen | 608
+
0
-

Však to tě nemá nikam přesměrovávat. Zobrazí ti to určitou šablonu, kterou si můžeš podle potřeby upravit.

zdrhal
Člen | 42
+
0
-

Já vím, jen jsem to blbě napsal. Jde o to, že ty šablony mám již připravené a nenačetlo ji to. Zobrazilo to klasickou PHP hlášku při internal erroru.

Editoval zdrhal (10. 7. 2014 14:00)

David Matějka
Moderator | 6445
+
0
-

dodam, ze je mozno zapnout error presenter i s debug modem, staci do configu uvest:

nette:
	application:
		catchExceptions: true
zdrhal
Člen | 42
+
0
-

Děkuji ti matěji. Toto mě už radil i Jirka Pudil v příspěvku výše, zrovna to testuji. :-)

Editoval zdrhal (10. 7. 2014 14:04)

zdrhal
Člen | 42
+
0
-

Všiml jsem si, že mám u Error presenteru chybu, že dědí BasePresenter. Je třeba dědit z Nette\Application\UI\Presenter. Akorát mi to hází tuto chybu, neví někdo co s tím?

Cannot load presenter 'Front:Error', class 'App\FrontModule\Presenters\ErrorPresenter' was not found in 'C:\Users\zdrhal\Desktop\cd\EasyPHP-DevServer-14.1VC9\data\localweb\webtrener\app/FrontModule/presenters/ErrorPresenter.php'.

Nechápu jak může řvát, že tam není. Přitom tam je. :-D

Editoval zdrhal (10. 7. 2014 14:30)

Michal Vyšinský
Člen | 608
+
0
-

Ne, není. Namespace != filepath. Error presenter se musí jmenovat ErrorPresenter v namepsace App\FrontModule\Presenters

zdrhal
Člen | 42
+
0
-

Já jsem ho už přejmenoval, takže jméno sedí. Ale problém bude s tím namespace já ho tam asi neuvedl a to asi bude třeba co? Zkusím to. Jsem takový „programátor“ pokus omyl no :-) děkuji za radu.

EDIT: Tak jsem to nakonec rozchodil. :-) Velmi děkuji všem, co se mi snažili pomoci.
Má to ještě jednu malou mouchu, že všechny chyby lítaj pouze jako 500 i když by to mělo
odchytávat zvlášť 404 a 500. Nad tím už ale mávnu ocasem. Hlavně, že to funguje takto.
:-D
EDIT2: Tak už mě to šlape se fším fšudy. V ErrorPresenter chyběl namespace u odchytu chyby.
Děkuji všem za pomoc! :-)

Editoval zdrhal (10. 7. 2014 15:26)