2011-12-28 103 views
0

我有一个uri方案,就像<country>/<id>_<action>/<name>,它从一个旧网站下降,我将该网站移植到Kohana framewerk。一个可能的URL是http://www.example.com/us/1234_1/fooKohana 3.2路由重写动作

<action>的值是从0到9的数字:\d。每个数字指的是一个动作,例如0overview

如何在bootstrap中设置我的路由,请求的操作正确移植。

这是我现在,但显然它不正确的行为,因为它试图调用的函数的Action_0代替Action_Overview,给出的例子网址:

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

回答

2

一个解决办法是命名action_0到action_9,但我们中的任何一个都喜欢。

另一种解决办法是“重新路由”在控制器::动作之前()是这样的:

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

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

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

或者你可以做,在一个lambda /回调路线,但我会保持它的控制器::之前()。

0

干净的解决方案当然会很好,但恐怕没有一个可用。我可以想出几个办法来处理它,但是,没有一个是理想的。

否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足够灵活以允许解决方案违背它的一般风格...... :))