【问题标题】:CakePHP Prefix RoutingCakePHP 前缀路由
【发布时间】:2013-10-09 16:00:31
【问题描述】:

我该怎么做

domain.com/api/somecontroller/someaction

domain.com/somecontroller/someaction

指向同一个控制器动作:

class somecontroller {

   function someaction() {

   }
}

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

例如:

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 时失败一样。

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

【问题讨论】:

  • “有没有更简单的方法来完成我想要的任务?” 是的,它叫做 mod rewrite。
  • 您不需要 mod_rewrite,蛋糕路由系统会处理一切。您可以使用通配符和占位符,请参阅下面的答案。
  • 无论你是否需要,mod rewrite 仍然是处理这种情况的更好、更有效的方法。只是说...

标签: php cakephp


【解决方案1】:

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

所以在 app/Config/routes.php 中只添加一条规则,它将涵盖您想要的所有内容..

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2014-02-19
    相关资源
    最近更新 更多