【问题标题】:Use route prefix with RESTful routes in CakePHP在 CakePHP 中使用带有 RESTful 路由的路由前缀
【发布时间】:2014-01-03 06:25:34
【问题描述】:

正在构建 API 并希望使用 RESTful routes

我让它像这样正常工作:

http://www.mysite.com/events.json  // returns json results with my events
http://www.mysite.com/events/123.json // returns json results with event of id '123'

但是 - 我希望能够使用“api”前缀来做到这一点。

所以,我添加了 api 路由前缀:

Configure::write('Routing.prefixes', array('admin', 'api'));

并将我的操作从“view”和“index”更改为“api_view”和“api_index”。

但现在它不起作用。 (例如,我必须写下动作名称,否则它不会根据 HTTP 找到正确的名称。

最终目标是能够做这样的事情:

GET http://www.mysite.com/api/1.0/events.json // loads events/api_index()
GET http://www.mysite.com/api/1.0/events/123.json // loads events/api_view($id)
DELETE http://www.mysite.com/api/1.0/events/123.json // loads events/api_delete($id)
...etc

【问题讨论】:

    标签: rest cakephp routes prefix


    【解决方案1】:

    我知道这是一篇旧帖子,但是有一个名为 mapResources 的路由方法,它为您创建了基于特殊方法的路由。

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

    你把它放在 routes.php 中,像这样:

    Router::mapResources(array('controller1', 'controller2'));
    

    文档有一个漂亮的小表格显示请求如何映射到不同的操作,如果需要,您可以随时覆盖。

    【讨论】:

      【解决方案2】:

      我最终不得不手动编写路线:

      Router::parseExtensions('json', 'xml');
      
      Router::connect('/api/:version/:controller/:id/*',
      array('[method]'=>'GET', 'prefix'=>'api', 'action'=>'view'),
      array('version'=>'[0-9]+\.[0-9]+', 'id'=>'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'));
      
      Router::connect('/api/:version/:controller/*',
      array('[method]'=>'GET', 'prefix'=>'api', 'action'=>'index'),
      array('version'=>'[0-9]+\.[0-9]+'));
      
      Router::connect('/api/*', array('controller'=>'events', 'action'=>'index', 'ext'=>'html'));
      

      注意事项:

      [method] 是强制 HTTP 类型(例如 RESTful)的原因

      parseExtensions() 使您可以通过更改 URL 中的扩展名自动以不同格式显示数据。

      最后一个Router:: 行只是对任何不匹配的/api/ 的总称——它将它转发到主页。最终我可能会将其路由到 API 错误页面。

      最后一个 Router:: 行的 'ext'=>'html' 是为了防止 parseExtensions 尝试使用 URL 中的任何扩展名 - 如果它由于调用错误的原因而重定向,我只想让它返回主页(或其他)并使用普通视图。

      【讨论】:

        【解决方案3】:

        试试这样的。

        Router::connect('/:api/:apiVersion/:controller/:action/*',
            array(),
            array(
                'api' => 'api',
                'apiVersion' => '1.0|1.1|'
            )
        );
        

        带前缀路由

        Router::connect('/:prefix/:apiVersion/:controller/:action/*',
            array(),
            array(
                'prefix' => 'api',
                'apiVersion' => '1.0|1.1|'
            )
        );
        

        在此处仅匹配有效的 API 版本,例如 1.0 和 1.1。如果您想要其他内容,请在此处使用正则表达式。

        【讨论】:

        • 我可以很好地管理路由器 - 问题还在于允许 REST 根据 HTTP 类型确定它是否应该显示“视图”或“索引”等。
        • 在第二个参数数组中声明路由并使用 [method]。如这里所示book.cakephp.org/2.0/en/development/… 另见github.com/kvz/cakephp-rest-plugin
        • 我想我明白了 - 会在早上尝试。谢谢。
        • 这不起作用。点击 http://wwwmydomain.com/api/1.0/events/12345.json 会给出“找不到 Action EventsController::api_12345()”。 - 它应该在寻找api_view()
        • 我也试过了——但问题的关键不是“如何让路由工作”——而是如何能够使用前缀并仍然保留 mapResources 的功能(即根据 HTTP 类型自动确定视图)
        猜你喜欢
        • 2011-06-09
        • 2013-10-09
        • 2011-01-03
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 2012-09-26
        • 2015-06-04
        相关资源
        最近更新 更多