Конечно, было бы неплохо с чистым решением, но, боюсь, его нет. Я могу придумать несколько способов справиться с этим, однако ни один из них не идеален.
Нет 1. Это будет идея подуровня, предоставленная Darsstar
Нет 2. Будет похоже на решение №. 1, но используйте двойную систему маршрутов вдоль линий:
Route::set('default'), '<country>/<id>/<action>/<name>', array ('country' => '.+', 'name' => '.+', )) /* new */
->defaults(array(
'controller' => 'new',
'action' => 'index'
));
и
Route::set('legacy'), '<country>/<id>_<oldaction>/<name>', array ('country' => '.+', 'name' => '.+', 'oldaction' => '\d+', )) /* legacy */
->defaults(array(
'controller' => 'legacy',
'action' => 'route'
));
Новый контроллер будет использовать action_overview()
и т. Д. По своему усмотрению, а наследие будет содержать только одно действие, action_route()
делает что-то вроде этого:
public function action_route ()
{
$actions = array (0 => 'overview', ...);
$params = array (
'country' => $this->request->param ('country'),
'id' => $this->request->param ('id'),
'action' => $actions[$this->request->param ('oldaction')],
'name' => $this->request->param ('name'),
);
$this->request->redirect (Route::get ('legacy')->uri ($params));
}
Нет 3. Было бы просто использовать несколько маршрутов, если количество действий не так велико, рассмотрите возможность использования одного маршрута на действие, например:
Route::set('overview'), '<country>/<id>_0/<name>')
->defaults(array(
'controller' => 'index',
'action' => 'overview'
));
Route::set('details'), '<country>/<id>_1/<name>')
->defaults(array(
'controller' => 'index',
'action' => 'details'
));
Вы можете сделать это немного более управляемым, используя foreach()
в соответствии с этим:
$actions = array (
'overview',
'details',
);
foreach ($actions as $idx => $action)
{
Route::set($action), '<country>/<id>_' . $idx . '/<name>')
->defaults(array(
'controller' => 'index',
'action' => $action,
));
}
Когда это будет сделано, вы можете использовать контроллер с действием action_overview()
. В производстве используйте кэширование для маршрутов, чтобы не переопределять их при каждом запросе.
Лично я бы выбрал номер 3, если это прямой порт, и нет планов по расширению сайта новыми функциями. В противном случае я бы выбрал номер 2, потому что он допускает устаревший режим, который можно постепенно отключить. Кроме того, он допускает более гибкие «новые» маршруты.
Я бы не стал выбирать № 1 только потому, что, по моему мнению, это не соответствует стилю кодирования Kohana, я лично ожидал бы найти правила маршрутизации либо в bootstrap.php , либо init .php (в случае модулей). В противном случае это совершенно правильное решение (и в некотором смысле оно в стиле Kohana, поскольку Kohana достаточно гибок, чтобы принимать решения, противоречащие его общему стилю ... :))