干净的解决方案当然会很好,但恐怕没有一个可用。我可以想出几个办法来处理它,但是,没有一个是理想的。
否1.将由Darsstar
提供的subrouter想法否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足够灵活以允许解决方案违背它的一般风格...... :))