FILTER_IN odmítnutí routy

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

Zdravím,
jak lze v callbacku FILTER_IN odmítnout aktuální routu?
Pokud vrátím NULL, použije se výchozí hodnota toho parametru, což je nežádoucí.
Řešit to vyhozením BadRequest výjimky v tom callbacku mi nepřijde ideální a čisté řešení.

David Matějka
Moderator | 6445
+
0
-

ukaz prosim celou definici routy.

A muzes zkusit pouzit globalni filtry, tedy neco jako

new Route(..., array(
	NULL => array(
		Route::FILTER_IN = function($params) {
			if(vse_ok()) {
				return $params;
			} else {
				return NULL;
			}
		}
	)
);
vasam
Člen | 26
+
0
-

Moje routa:

$router[] = new Route('<pageId>', array(
    'presenter' => 'Page',
    'action' => 'default',
    'pageId' => array(
        Route::VALUE => $defaultId,
        Route::FILTER_IN => array($this->pageList, 'slugToId'),
        Route::FILTER_OUT => array($this->pageList, 'idToSlug'),
        Route::PATTERN => '.*?'
    )
));

Potřebuji v slugToId dát routě nějak vědět, že pro daný slug neexistuje článek.

Editoval vasam (3. 9. 2014 10:53)

vasam
Člen | 26
+
0
-

Tak jsem to zatím pořešil takto:

$router[] = new Route('<pageId>', array(
    'presenter' => 'Page',
    'action' => 'default',
    'pageId' => array(
        Route::VALUE => $defaultId,
        Route::FILTER_OUT => array($this->pageList, 'idToSlug'),
        Route::PATTERN => '.*?'
    ),
    NULL => array(
        Route::FILTER_IN => function ($params) use ($defaultId) {
                if ($params['pageId'] !== $defaultId)
                {
                    $params['pageId'] = $this->pageList->slugToId($params['pageId']);
                    if ($params['pageId'] === NULL) { return NULL; }
                }
                return $params;
            }
    )
));

Nejsem si ale jist, jestli je to čisté a pěkné řešení (mně se teda moc nelíbí ;-)).