Vyhazování BadRequestException z modelu
- stekycz
- Člen | 152
Pěkný den přeji,
v rámci svojí aplikace mám vytvořenou abstraktní třídu, ze které
dědí všechny modely. Ta zajišťuje načítání dat z databáze,
ukládání změň, detekci změn apod. Při vytváření instance předávám
konstruktoru ID záznamu v databázi. Často ho ale získám z URL a může se
stát, že stránka (respektive záznam v databázi) s tímto obsahem už
neexistuje (především při indexaci botem). V tom případě bych rád
vyhodil 404. Takže když se mi nepodaří z databáze nic načíst, hodím
BadRequestException
. Na localhostu i s PRODUCTION
módem mi to funguje bez problémů, ale na testovací subdoméně nebo na
ostrém webu se stránka zobrazí, jako kdyby se data načetly. Napadá někoho,
proč se nezobrazí moje 404 stránka?
Verze Nette: version 2.0-dev 9e52d77 released on 2010–12–21
Verze PHP localhost: 5.3.2–1ubuntu4.7
Verze PHP server: 5.2.3
PS: Kód píšu samozřejmě jen pro PHP 5.2.x.
Kódy:
ErrorPresenter.php
class ErrorPresenter extends BasePresenter {
public function renderDefault($exception) {
$this->template->title = "Server error!";
$this->template->error_code = 0;
if ($this->isAjax()) {
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
$this->setView('404');
$this->template->error_code = 404;
} else {
$this->setView('500');
$this->template->error_code = 500;
Debug::processException($exception);
}
}
}
bootstrap.php
...
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
$application->catchExceptions = true;
...
GenericRow.php
...
$line = dibi::fetch(...);
if (!$line) {
throw new BadRequestException('Row was not found in [' . $this->_tableName . '].');
}
...
Předem díky za odpovědi
Editoval Gruw (1. 3. 2011 23:41)
- stekycz
- Člen | 152
Díky za tipy. Zjistil jsem, že problém se zdá být skutečně ve verzích PHP. V PHP 5.2 nejspíše nefunguje konstrukce:
...
call_user_func_array('parent::_load', $args);
...
EDIT: Ano, tahle konstrukce nefunguje, ale ne kvůli rozdílu verzí, ale protože jsem blbej. :) Správný zápis je v Example#1 na posledním řádku: http://cz.php.net/…do-types.php#…
Nicméně pokud nechám rozhodovat Nette, zda odchytávat výjimky
(v závislosti ne DEBUG
nebo PRODUCTION
módu), tak
mi na produkčním serveru skočí 500 i když to testuji na PHP 5.3 (aby
předchozí chyba nenastávala). V DEBUG
módu mi normálně
vyskočí laděnka s exception. Pokud odchytávání nastaví přímo na
TRUE
, tak se správně zobrazí stránka v PRODUCTION
módu, ale zobrazí se i v DEBUG
módu. Jediný rozdíl je
v zobrazování DebugBaru
. Očekávaně se tedy záznam
o neodchycené výjimce BadRequestException
obbjeví v souboru
error.log
.
Editoval Gruw (2. 3. 2011 15:04)