Proč se filtrovací funkce provádí dvakrát?

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

Ahoj,

nechápu, proč se filtrovací funkce provádí(/vypisuje se to) dvakrát. Jak je to vůbec možné?

		$frontRouter[] = new Route('<slug [a-z]+>', array(
			'presenter' => 'Homepage',
			'action' => 'default',
			'slug' => array(
				Route::FILTER_IN => function ($slug) use($container) {
					echo 'X';
					die();
				},
				Route::FILTER_OUT => function ($id) use($container) {
				}
			)
		));

Pokud jdu na URL, která odpovídá routě, v prohlížeči se mi objeví „XX“, může mi to někdo vysvětlit?

Díky

Editoval joe (19. 1. 2013 7:19)

enumag
Člen | 2118
+
0
-

Z hlavy nevím, ale můžeš to snadno zjistit když místo die vyhodíš výjimku. Pomocí statické proměnné ji můžeš vyhodit až při druhém běhu funkce.

Filip Procházka
Moderator | 4668
+
0
-

Nejprve router zpracuje http request a vrátí požadavek pro presenter (to je to poprvé), potom presenter volá vytvoření url pro sebe sama (druhé volání).

Je to kvůli tomu, aby ověřil, že současná adresa je „kanonická“, tzn nejefektivnější možná (nejprvnější router, co nejméně parametrů v url). A když není, tak na ni přesměruje. Je to kvůli tomu, aby na každou stránku webu byl pouze jeden odkaz.

A může se ti povést, že se ti zavolá ještě jednou, když se vykresluje routovací panel, to se pak zavolá vždy, ikdybys tam volal exit (nebo die).

enumag
Člen | 2118
+
0
-

@Filip Procházka: To mne napadlo, ale ta kanonikalizace URL tvoří takže by měla použít spíše FILTER_OUT než FILTER_IN, ne?

joe
Člen | 313
+
0
-

OK, díky za vysvětlení.

@Filip Procházka:
To znamená, že pokud mám například metody slugToId a idToSlug, tak si musím uvnitř metod zařídit cachování, protože jinak místo dvou dotazů se zavolaní celkem čtyři (dva totožné, zbytečně – myšleno zbytečné stejné dotazování)?

Filip Procházka
Moderator | 4668
+
0
-

Přesně tak. Technice kterou hledáš se říká identity map :)

joe
Člen | 313
+
0
-

Díky, ale jak to udělat, pokud chci používat dibi? Nechci žádného pomocníka notORM ani ORM framework, protože mi to přijde zbytečné (prosím nevyvracet :), díky).
Nechci žádné zbytečné dotazy, ale v tomto případě se udělají navíc 2 a další stejný dotaz v Presenteru (voláním metody modelu). Ještě prosím nakopnout jak to udělat bez těch 3 zbytečných dotazů na DB? díky

Aha, vlastně si to asi můžu řešit v modelu, nějakým polem $cache, třeba, ne?

Editoval joe (19. 1. 2013 21:43)