2013-12-15 88 views
2

正在构建API并希望使用RESTful routes在CakePHP中使用具有RESTful路由的路由前缀

我得到它的工作只是罚款是这样的:

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')); 

而且从 '视图' 和 '指标' 到 '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 

回答

0

试试这样的。

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在这里。如果你想要其他的东西在那里使用正则表达式。

+0

我可以很好地管理路由器 - 这个问题还允许REST根据HTTP类型确定它是否应该显示“视图”或“索引”等。 – Dave

+0

声明路由并在第二个参数数组中使用[method]。像这里显示http://book.cakephp.org/2.0/en/development/routing.html#using-additional-conditions-when-matching-routes另见https://github.com/kvz/cakephp-rest-插件 – burzum

+0

我想我明白了 - 将在早上尝试。谢谢。 – Dave

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类型(例如REST风格的。)

parseExtensions()使它可以通过更改外壳自动显示不同格式的数据您的网址中包含了nsion。

最后一个Router :: line对于任何/ api /不匹配的东西只是一个catchall - 它将它转发到主页。最终我可能只是将其路由到一个API错误页面。

最后一个Router :: line的'ext'=>'html'是为了让parseExtensions不要尝试使用URL中的任何扩展名 - 如果因重定向导致调用错误,我只想让它返回主页(或任何),并使用正常的看法。

0

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

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

你把它放在routes.php文件像这样:

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

的文档有一个展示的请求是如何映射到不同的操作,您可以随时如果重写一个可爱的小表需要。