【问题标题】:CakePHP Route for APIAPI 的 CakePHP 路由
【发布时间】:2011-02-10 12:15:36
【问题描述】:

基本上我正在开发一个带有 cake 的 API,我想在我的 URL 中添加一些版本控制,以便以后更轻松地升级 API。

我现在不是在寻找任何花哨的路线,只是路线

domain.com/api/1.9/:控制器工作。

我很难让它发挥作用。目前简单请求有效,但向 domain.com/api/1.0/pictures/ 发送 POST 请求失败。

【问题讨论】:

  • 你是如何定义你的路线的?
  • 目前只有这些:Router::connect('/api/1.0/:controller/:action', array()); #RESTful 路由器 aan!路由器::mapResources('ratings');路由器::mapResources('图片'); Router::parseExtensions('xml', 'json');
  • 向 `domain.com/api/1.0/pictures 发送帖子(注意没有尾部斜杠)有效吗?
  • 请注意您的版本中的那个点不会触发扩展解析。如果我是你,我会选择整数版本,ala v1/v2/v3
  • @joeb 不,这给了我:Error: ApiController could not be found.

标签: php api cakephp routes


【解决方案1】:

Frank Mullenger 拥有我发现的版本化 CakePHP API 的最佳解决方案。他发布了一个由三部分组成的系列,充分利用了 Cake 的路由和一些自定义 API 方法。

First part (the problem with un-versioned APIs)

Second part (the solution for CakePHP)

Third part (error handling)

【讨论】:

    【解决方案2】:

    这是一个关于在不使用智能路由的情况下做你想做的事的想法,但你需要稍微改变一下其余调用 URL。

    而不是

    domain.com/api/1.0/pictures/$param1/$param2/$etc
    

    试试

    domain.com/api/pictures/1.0/$param1/$param2/$etc
    

    然后在控制器中,

    class Pictures extends controller {
      ....
      function pictures( $ver , $param1, $param2, $etc) {
        switch($ver) {
          case '1.3':
            $this->setAction('pictures_1-3', $param1, $param2, $etc);
            break;
          case '1.2':
            $this->setAction('pictures_1-2', $param1, $param2, $etc);
            break;
          case '1.1':
          default:
            $this->setAction('pictures_1-1', $param1, $param2, $etc);
            break;
         }
       }
    
       function pictures_1-3() {}
       function pictures_1-2() {}
       function pictures_1-1() {}
    }
    

    【讨论】:

    • 这似乎会给您的控制器添加大量不必要的代码。处理多个 API 不应该是任何一个控制器的工作。
    • 嗯,这取决于您是否需要并行支持 API 的多个版本。比如 Direct3D API,有一个函数 Direct3DCreate9 来创建渲染上下文。还有 Direct3DCreate8、Direct3DCreate7 等。它们仍然有效。如果您可以在没有太多抱怨的情况下向您的客户指示 API 更改(ala Facebook),那么这是最干净的方式。如果您必须同时支持多个,那么它是控制器中的重复代码。如果不是控制器,那么模型。它必须去某个地方。 (请上帝不要使用 C++ 风格的 IFDEF!):D
    • @joeb:您可以轻松地创建该函数的通用形式并将其嵌入到您的 AppController 中。
    • 我宁愿看到有人将不同的 API 放入特定于它对应版本的插件中。这样一来,每个人就彼此分开生活。
    • 我不认为 DX api 是 any 开发的好榜样,@zeroSkillz。就个人而言,我会将它们放在前缀路由方法中,除非它们有显着不同,然后我会按照@joeb 的建议将它们放入插件中。
    猜你喜欢
    • 2014-09-15
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2012-08-17
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多