Kohana, Заметки → Роуты в kohana 3.2/3.3

Все, кто используют фреймворк kohana, наверное уже знают, что несколько дней назад вышла версия 3.3.0. Изменений не то, чтобы много, но многие из них (как обычно) что-либо меняют кардинально, т.е. обновить старые проекты просто так не получится (.

В ближайшее время постараюсь рассказать об особенностях тех изменений, которые коснулись меня, а сегодня покажу приятные изменения в роутах. Как Вы, наверное, знаете — начиная с версии kohana 3.1 и при использовании php 5.3, можно было использовать лямбда-функции в роутах. Выглядело это примерно так (в моем случае и пример упрощенный):

Route::set('redirect', function($uri){
	$compiled = Route::compile('r/<key>', array('key'=>'\w+'));
	if (!preg_match($compiled, $uri, $matches))
	{
		return FALSE;
	}
	
	$url = @base64_decode($matches['key']);
	if (empty($url))
	{
		return FALSE;
	}
	
	return array(
		'controller'  => 'link',
		'action'      => 'index',
		'key'         => $matches['key'],
	);
}, 'r/<key>');


Не скажу, что не удобно, но не совсем логично:

1. Сам роут дублируется дважды — этого редко удается избежать (я вообще старался делать именно так, как в примере, т.к. было очень лень лезть в доки).
2. В данном примере (да и вообще, при использовании лямбда-функций) функция обработки урла не должна быть в самом роуте. Имхо, задача роута — получить урл и подсказать, куда направить данный запрос, не более того.

С появлением фильтров в kohana 3.3 эти два момента решены практически идеально. Вот, например, роут из нового проекта:

Route::set('link', 'r/<key>', array('key'=>'\w+'))
	->defaults(array(
		'controller' => 'link',
		'action'     => 'index',
	))
	->filter(function(Route $route, $params)
	{
		$url = @base64_decode($params['key']);
		if (empty($url))
		{
			return FALSE;
		}
		// Тут можем добавить какие-то параметры к роуту
		return TRUE;
	});

На мой взгляд, стало намного лаконичнее выглядеть, а Вы как считаете?