Вы определяете два маршрута и не перегружаете регулярное выражение ни для одного сегмента.Регулярное выражение для сегмента по умолчанию [^/.,;?\n]++
, поэтому каждый сегмент должен соответствовать этому регулярному выражению.
Ваш первый маршрут - это маршрут, который идет с Kohana из коробки.Он будет соответствовать 0, 1, 2 и 3 сегментам, разделенным косой чертой.Ваш второй маршрут будет соответствовать 1, 2, 3 и 4 сегментам.
Поскольку вы добавите их в таком порядке, маршрут с именем «default» не сможет соответствовать только для более чем трех сегментов, таких как uri: user / purcheses/ просмотр / 42.Если маршрут по умолчанию не соответствует URI, будет проверен следующий маршрут.В вашем случае маршрут с именем «backend».
Если вы поменяете местами порядок двух маршрутов, то маршрут «backend» будет первым и потерпит неудачу только для 0 или более 4 сегментов.С 0 сегментами маршрут 'default' будет соответствовать ему, а с 5 или более сегментами будет выдано Http_Exception_404.Но когда вы помещаете 'backend' первым, он будет направлять только к контроллерам в подкаталогах, которые, скорее всего, разбивают много страниц.
Вы можете заменить <directory>
на жестко закодированное значение, добавив регулярное выражение длясоздать лямбда / маршрут обратного вызова.
По порядку:
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',
));