Kde volat logování všech dotazů, aby se započítali i ty vytvářené v šablonách
- Mysteria
- Člen | 797
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í.
- looky
- Člen | 99
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)