Zachytávání výjimek errorPresenterem v bootstrapu

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

Zdravím,
v bootstrapu se kromě jiného připojuji k databázi, a když je databáze nedostupná (stát se to může) bych rád zobrazil formátovanou chybovou zprávu místo prázdné stránky. ErrorPresenter mám nastavený a funkční, ale výjimku z bootstrapu nezachytí. Výjimky z aplikace ano.

Je na tento problém nějaké řešení nebo je řešením přesunout připojování k databázi někam jinam?

kravčo
Člen | 721
+
0
-

Výnimky aplikácie sú zachytávané v rámci „životného cyklu aplikácie“, v metóde Application::run(), bootstrap mu predchádza – presnejšie on tento cyklus len spúšťa na svojom konci, preto výnimky z neho aplikácia nemá ako zachytiť.

Riešením by mohlo byť napríklad použitie udalosti aplikácie onStartup:

class MyTools
{
    public static function connect2database(Application $app)
    {
        dibi::connect(Environment::getConfig('database'));
    }
}

$application = Environment::getApplication();
$application->onStartup[] = 'MyTools::connect2database';

$router = $application->getRouter();
$router[] = ...

$application->run();
vlki
Člen | 218
+
0
-

Vzhledem k tomu, že ErrorPresenter začne zachytávat až když je spuštěná aplikace, tak je potřeba je přesunout jinam.

Pěkné řešení je si udělat nějakou metodu/fci, ve které proběhne připojení k databázi. V bootstrapu pak tuhle metodu/fci navázat na událost onStartup aplikace.

class BaseModel extends Object {
	public static function connect()
	{
		// some db connecting
	}
}

// bootstrap.php

$application->onStartup[] = 'BaseModel::connect';

EDIT: Měla by se do fóra dodělat nějaká kontrola, zda při psaní příspěvku nedošlo k přidání dalšího. Třeba jen nějaký confirm. Což? Tohle se stává nějak moc často:) Takže… Byl jsi rychlejší kravčo:)

Editoval vlki (17. 9. 2009 17:19)

redhead
Člen | 1313
+
0
-

Řekl bych že připojení by mělo být lazy, čili připojit se pokud je to při současném požadavku nutné. Já to dávám do nějakého modelu (singletonu).

Editoval redhead (17. 9. 2009 17:27)

Aurielle
Člen | 1281
+
0
-

Děkuju, zase jsem chytřejší :)

vlki
Člen | 218
+
0
-

redhead napsal(a):

Řekl bych že připojení by mělo být lazy, čili připojit se pokud je to při současném požadavku nutné. Já to dávám do nějakého modelu (singletonu).

Obecně ano. Doplním jen, že pokud se k připojování používá dibi, může být lenivá za vás. Stačí v parametrech nastavit lazy na TRUE a k samotnému připojení k serveru dojde až při prvním požadavku na dibi.

redhead
Člen | 1313
+
0
-

psal jsem to obecně, protože o dibi nebyla řeč. Doufal jsem že něco takového dibi mít bude, teď aspoň vím jak na to :)