Использовать жестко заданные ссылки не очень верно т.к. роуты могут изменить URL, соответственно придется везде вылавливать и менять ссылки, строить же ссылки непосредственно с помощью Route::url() неудобно, да и выглядит не читабельно(длинно). Поэтому я сделал вот такой метод-хэлпер, которой еще и кеширует результаты:
/**
* Create a cache tag(id) using the attributes methods.
*
* @return string
*/
public static function tag()
{
return serialize(func_get_args());
}
/**
* Create URL based on route. This is a shortcut for: Route::url. URL cached.
*
* CMS::url('route:default'); // Home page
* CMS::url(''); // Current URL
* CMS::url('route:current,action:delete,id:2'); // Based on current route
* CMS::url('controller:article,action:list,page:2'); // Based on default route
* CMS::url('route:articles,controller:article,action:list,page:2');
*
* @param string $params String with route params
* @param boolean $escape_html Convert url special characters to HTML entities?
* @param boolean $lower_case Convert url to lower case?
* @param mixed $protocol Protocol string or boolean, adds protocol and domain
* @return string
* @uses Request, Route, HTML, Text, UTF8
* @uses CMS::tag
* @throws CMS_Exception
*/
public static function url($params_str, $escape_html = TRUE, $lower_case = TRUE, $protocol = NULL)
{
if (empty($params_str))
{
// Get current page URL
$url = Request::initial()->url($protocol);
}
else
{
// Try load URL from cache
if (Kohana::$caching)
{
$tag = CMS::tag('url', $params_str, $escape_html, $lower_case, $protocol);
if ($url = Kohana::cache($tag))
{
return (string) $url;
}
}
// Modify URL string in JSON and convert in array
$url = str_replace(array(',', ':'), array('","', '":"'), $params_str);
if ($params = json_decode('{"'.$url.'"}', TRUE, 2))
{
$route = isset($params['route']) ? $params['route'] : 'default';
unset($params['route']);
if ($route == 'current')
{
$request = Request::current();
$params = array_merge($request->param(), $params);
$params += array(
'directory' => $request->directory(),
'controller' => $request->controller(),
'action' => $request->action(),
);
$route = Route::name($request->route());
}
$url = Route::url($route, $params, $protocol);
}
else
{
// Use links in format: 'option:value,option2:value2'
throw new CMS_Exception('Wrong url format: :url', array(':url' => $params_str));
}
}
// Use URL modificators
$url = ($escape_html ? HTML::chars($url) : $url);
$url = ($lower_case ? UTF8::strtolower($url) : $url);
$url = str_replace('\\', '/', $url).'/';
$url = Text::reduce_slashes($url);
// Save result URL in cache
if ( ! empty($params_str) AND Kohana::$caching)
{
Kohana::cache($tag, $url, Date::DAY);
}
return $url;
}