您定义了两条路线,并且不要“重载”任何段的正则表达式。段的默认正则表达式为[^/.,;?\n]++,因此每个段都必须匹配该正则表达式。
您的第一条路线是 Kohana 开箱即用的路线。它将匹配由斜线分隔的 0、1、2 和 3 个段。
您的第二条路线将匹配 1、2、3 和 4 段。
由于您按该顺序添加它们,因此名为“默认”的路由将仅匹配三个以上的段,例如此 uri:user/purcheses/view/42。当路由“默认”无法匹配 uri 时,将检查下一个路由。在您的情况下,名为“后端”的路由。
如果您交换两条路线的顺序,则路线“后端”将排在第一位,并且只会在 0 或更多然后 4 段失败。使用 0 段时,路由“默认”将匹配它,而使用 5 段或更多段时,将抛出 Http_Exception_404。
但是,当您首先放置“后端”时,它只会路由到子目录中的控制器,这很可能会破坏很多页面。
您可以将 <directory> 替换为硬编码值,为 the 添加正则表达式或创建 lambda/回调路由。
按顺序:
Route::set('backend', 'backend(/<controller>(/<action>(/<id>)))')
->defaults(array(
'directory' => 'backend',
'controller' => 'home',
'action' => 'index',
));
Route::set('backend', '<directory>(/<controller>(/<action>(/<id>)))', array('foo|bar|backend'))
->defaults(array(
'directory' => 'backend',
'controller' => 'home',
'action' => 'index',
));
// not tested
Route::set('nested', function($uri, $directory = '')
{
if ( ! $segments = explode('/', $uri))
return;
// get a multidimensional array of the Cascading File System with classes/controller as the root
$list = Kohana::list_files('classes/controller');
foreach($segments AS $segment)
{
if ( ! isset($list['classes/controller/'.$directory.$segment]))
break;
// we found a new existing directory, append it
$directory .= array_shift($segments).DIRECTORY_SEPARATOR;
// reduce $list to the remaining possible paths
$list = $list[rtrim('classes/controller/'.$directory, DIRECTORY_SEPARATOR)];
}
if ( ! empty($directory) AND $params = Route::get('default')->matches(implode('/', $segments)))
{
$params['directory'] = rtrim($directory, DIRECTORY_SEPARATOR);
return $params;
}
},
// this is used for reverse routing
'<directory>(/<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'dashboard',
'action' => 'index',
));