Vyhazování BadRequestException z modelu

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

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)

voda
Člen | 561
+
0
-

Zkus místo:

bootstrap.php

...
$application->catchExceptions = true;
...

použít:

$application->catchExceptions = Environment::isProduction();
Mikulas Dite
Člen | 756
+
0
-

To by mělo být defaultně, ale nepodařilo se mi to teď v nette najít.

Filip Procházka
Moderator | 4668
+
0
-

Vskutku, neni to tam.

stekycz
Člen | 152
+
0
-

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)