Routování a objekty (neskalární parametry)

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

Existuje nějaký důvod, proč neskalární parametry v routě nejsou zpracovány FILTER_OUT?

Používám něco jako:

$frontRouter[] = new Route('<id>/<action>', [
	'presenter' => 'Page',
	'action' => 'default',
	'id' => [
		Route::PATTERN => '[^/]+',
		Route::FILTER_IN => function ($url) use ($container) {
			return $container->doctrine->orm->entityManager
				->getRepository(Ajat\Model\Entities\Page::getClass())
				->findOneByUrl($url);
		},
		Route::FILTER_OUT => function (Ajat\Model\Entities\Page $page) {
			return $page->url;
		}
	]
]);

Což mi umožňuje elegantní věci jako:

public function actionDefault(Ajat\Model\Entities\Page $id)
{
	...
}

Nebo například v šablonách ($page je zde Doctrine entita Ajat\Model\Entities\Page):

<a n:href="Page: $page">Odkaz</a>

Jenže kvůli zmíněnému řádku v Route toto nefunguje.

Editoval Juan (21. 9. 2012 19:58)

Filip Procházka
Moderator | 4668
+
0
-

Nějaký tam je, ale myslím že je to především fault-barier. Btw, tohle afaik nestačí, ještě zpracování parametrů v presenteru je zahazuje taky. Testoval jsi to?

Jan Jakeš
Člen | 177
+
0
-

tímhle PR mi ten uvedený kód funguje.

Jan Jakeš
Člen | 177
+
0
-

Funguje to zřejmě z tohoto důvodu.

Mimochodem, jaktože PresenterComponentReflection chybí v API?

David Grudl
Nette Core | 8171
+
0
-

Teoreticky by se if (!is_scalar($params[$name])) mohlo nahradit za if (is_object($params[$name]))

Jan Jakeš
Člen | 177
+
0
-

To by ale zase vynechalo FILTER_OUT na parametry typu objekt, ale já chci pravý opak – aby i objekt tímto filtrem prošel. Tedy, aby i objekt došel až sem.

jtousek
Člen | 951
+
0
-

Používal jsem podobný patch, ale později jsem tuhle logiku přesunul do presenteru. Konkrétně do metody startup a saveState.

Majkl578
Moderator | 1364
+
0
-

Bump, nějaký update?