Route FILTER::OUT, FILTER::IN pouze statické?

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

Ahoj, asi přemýšlím logicky zcela špatně, ale nedá mi to se nezeptat…mám service, která dostává autowiringem connection do databáze. V této službě mám metody slugToId a idToSlug tak, aby je routovací filter načetl. Jenže tyhle metody se volají staticky, takže si nemůžu šáhnout do databáze přes this, a dostávám se do situaci, kterou neumím nějak uspokojivě vyřešit…poradí někdo?

h4kuna
Backer | 740
+
0
-

Tak je nedělej staticky, pokud je potřebuješ v bootstrapu tak tam mas proměnou $container a tou si sahneš na ten model co potřebuješ, případně to předáš jako callback těm parametrům FILTER::IN/OUT

potapnik
Člen | 127
+
0
-

A jak předám ten slug/id tomu callbacku? Kod mam nyní následující:

<?php

$container->router[] = new Route('<slug [a-z-0-9]+>', array(
    'presenter' => 'Homepage',
    'action' => 'page',
	'page' => array(
        Route::FILTER_IN => callback($container->pages->slugToId),
        Route::FILTER_OUT => callback($container->pages->idToSlug)
    ),
));

?>

Nicméně mi to odkazy v šabloně n:href nepředělává…asi to nepředává parametry těm funkcím, jestli tomu dobře rozumím.

Marek Šneberger
Člen | 130
+
0
-
$container->router[] = new Route('<slug [a-z-0-9]+>', array(
    'presenter' => 'Homepage',
    'action' => 'page',
    'page' => array(
        Route::FILTER_IN => function ($slug) use($container){return $container->pages->slugToId($slug)},
        Route::FILTER_OUT => function ($id) use($container){return $container->pages->idToSlug($id)}
    ),
));

A v modelu si uděláš metodu (NE statickou), která ti vrátí požadovaný ID nebo SLUG.

h4kuna
Backer | 740
+
0
-

callback by jsi zapsal:

<?php
callback($container->pages->slugToId)
$container->router[] = new Route('<slug [a-z-0-9]+>', array(
    'presenter' => 'Homepage',
    'action' => 'page',
    'page' => array(
        Route::FILTER_IN => callback($container->pages, 'slugToId'),
        Route::FILTER_OUT => callback($container->pages, 'idToSlug')
    ),
));
?>

Anonymní fce bude asi lepší, jak psal Marek Šneberger

Editoval h4kuna (18. 10. 2012 16:42)

potapnik
Člen | 127
+
0
-

Ano, anonymní funkce vše vyřešily, navíc to vypadá i celkem pěkně, logicky a přehledně :-) Díky všem za rady. Začínám tak trochu chápat, jak to funguje :-)