Kde volat logování všech dotazů, aby se započítali i ty vytvářené v šablonách

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

Zdravím podle tématu https://forum.nette.org/…u-do-souboru chci udělat logování všech dotazů.
Do BaseRepository jsem si hodil tohle:

public function prepareLogQueries() {
	$this->database->connection->onQuery[] = function(\Nette\Database\Connection $connection, \Nette\Database\ResultSet $result) {
		$this->queryTime += $result->time;
		$this->queryCount++;
		barDump($this->queryCount);
	};
}

public function writeQueries() {
	barDump($this->queryCount);
}

Problém ale nastává, kde volat writeQueries(), aby tam byli všechny dotazy. Předpokládal jsem, že když to budu volat v BasePresenteru v shutdown metodě, že by to mohlo fungovat, ale nefunguje. Pokud pro vykreslení stránky použiju jenom metody z BaseRepository typu getAll() a podobně, tak normálně to vypíše skutečný počet.

Problém je, když na to pak dál navážu v šabloně další dotazy třeba pomocí ->related(). V tom případě, pak writeQueries() vrací jenom počet dotazů z BaseRepository, ale ty ze šablony do toho započítané nejsou.

Z toho mě vychází, že se writeQueries() musí zavolat ještě předtím, než jsou započítány dotazy ze šablony, což taky potvrzuje fakt, že kontrolní výpisy normálně vypíšou třeba 1 – 30 (dotazů), přičemž třeba 10 je tam 2×, jednou z onQuery[] dumpu a po druhé z writeQueries() dumpu a pak je tam teprve zbytek dotazů ze šablony.

Takže otázka ní, v jaké metodě volat to zalogování dotazů aby se tam započítali opravdu všechny dotazy včetně těch ze šablon?

Díky za nakopnutí.

h4kuna
Backer | 740
+
+1
-

Nemám vyzkoušené, použít event onShutdown nad službou application?

looky
Člen | 99
+
0
-

V masteru je ContainerBuilder::findByType, kterou si můžeš v nějaké svojí extensioně vytáhnout všechny služby Connection a přidat jim onQuery. Bohužel to ale zatím není v Nette.. :(

EDIT: započítalY :/

EDIT2: Ještě jednodušší by asi bylo použít DecoratorExtension, ale to je opět pouze v masteru.

Editoval looky (5. 1. 2015 10:30)

Mysteria
Člen | 797
+
0
-

@h4kuna: Super, funguje, díky.

@looky: Connection používám jenom jednu a to přes BaseRepository, takže tohle není problém navázat tam. Jenom jsem potřeboval vědět název poslední volané metody při ukončování Nette. Ale i tak díky.