Kohana 3.2 маршрутизация действия переписать - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть схема uri, которая похожа на <country>/<id>_<action>/<name>, которая происходит от старого сайта, и я портирую сайт на фреймворк Kohana. Возможный URL-адрес: http://www.example.com/us/1234_1/foo

Значение <action> - это цифра от 0 до 9: \d. Каждая цифра относится к действию, например, 0 - это overview.

Как настроить маршрутизацию в начальной загрузке, если запрошенное действие перенесено правильно.

Это то, что у меня есть сейчас, но, очевидно, оно не ведет себя правильно, потому что пытается вызвать функцию Action_0 вместо Action_Overview, учитывая пример URL:

Route::set('default'), '<country>/<id>_<action>/<name>')
     ->defaults(array(
        'controller' => 'index',
        'action'     => 'index'
     ));

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Одним из решений было бы присвоить действия action_0 действию_9, но мне обоим это нравится.

Другим решением было бы «перенаправить» действие в Controller :: before () следующим образом:

public function before()
{
    parent::before();

    $actions = array(0 => 'overview', ...);

    $this->request->action($actions[$this->request->action()]);
}

Или вы можете сделать это по маршруту лямбда / обратного вызова, но я бы оставил его в Controller :: before ().

0 голосов
/ 04 января 2012

Конечно, было бы неплохо с чистым решением, но, боюсь, его нет. Я могу придумать несколько способов справиться с этим, однако ни один из них не идеален.

Нет 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 достаточно гибок, чтобы принимать решения, противоречащие его общему стилю ... :))

...