Nefungující errorPresenter
- zdrhal
- Člen | 42
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)
- zdrhal
- Člen | 42
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
Error presenter by imo měl taky respektovat mapping,
tzn. App\FrontModule\Presenters\ErrorPresenter
- Michal Vyšinský
- Člen | 608
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
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
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
Jak máš v bootstrap.php zakomentované setDEbugMode(TRUE)
tak
to odkomentuj a nastav na FALSE
Editoval Michal Vyšinský (10. 7. 2014 13:46)
- Michal Vyšinský
- Člen | 608
Však to tě nemá nikam přesměrovávat. Zobrazí ti to určitou šablonu, kterou si můžeš podle potřeby upravit.
- David Matějka
- Moderator | 6445
dodam, ze je mozno zapnout error presenter i s debug modem, staci do configu uvest:
nette:
application:
catchExceptions: true
- zdrhal
- Člen | 42
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
Ne, není. Namespace != filepath. Error presenter se musí jmenovat
ErrorPresenter
v namepsace App\FrontModule\Presenters
- zdrhal
- Člen | 42
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)