如何在CakePHP中将前缀和未加前缀的路由指向同一个操作

时间:2013-10-01 15:46:17

标签: php cakephp

如何制作

domain.com/api/somecontroller/someaction

domain.com/somecontroller/someaction

指向相同的控制器操作:

class somecontroller {

   function someaction() {

   }
}

注意:我不想只重新路由一个动作。但我想将domain.com/api/*的所有路由重新路由到没有'api'前缀的相应URL。

e.g:

domain.com/api/controller              ->  domain.com/controller
domain.com/api/controller/action       ->  domain.com/controller/action
domain.com/api/controller/action/param ->  domain.com/controller/action/param
domain.com/api/controller/action?key=val ->  domain.com/controller/action?key=val

我尝试在routes.php中添加以下内容:

Router::connect('/api', array('controller'=>'index', 'action'=>'index'));
Router::connect('/api/:controller', array('action'=>'index'));
Router::connect('/api/:controller/:action');
Router::connect('/api/:controller/:action.:ext');

它适用于定义的规则。但我似乎并没有涵盖所有情况。就像使用URL参数,插件和其他高级URL时失败一样。

是否有更简单的方法来完成我想要的任务?

2 个答案:

答案 0 :(得分:0)

您不需要这4条规则,因为您可以在CakePHP的路由系统中使用通配符(*)。

所以在app / Config / routes.php中只添加一条规则,涵盖你想要的一切......

Router::connect('/api/:action/*', array('controller' => 'mycontroller'));

然后,每个http://domain.com/api/someaction的请求都会以http://domain.com/mycontroller/someaction结束。

我的代码示例中唯一需要更改的是控制器的名称,我上面指定了 mycontroller

您看到的:操作部分基本上是请求中指定的任何操作的占位符, * 是通配符。

答案 1 :(得分:-1)

您应该能够将两者都添加到路线配置中,并将它们指向同一个地方。

这可以帮到你:

http://book.cakephp.org/2.0/en/development/routing.html