致力于构建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
答案 0 :(得分:3)
我最终不得不手动编写路线:
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()
使您可以通过更改网址中的扩展程序,自动显示不同格式的数据。
最后一个Router :: line只是对任何/ api /不匹配的东西 - 它将它转发到主页。最终我可能只是将其路由到API错误页面。
最后一个Router ::行的'ext'=>'html'
是为了防止parseExtensions尝试使用URL中的任何扩展名 - 如果它因为调用错误而导致重定向,我只是想让它回到主页(或其他)并使用普通视图。
答案 1 :(得分:1)
尝试这样的事情。
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。如果你想要别的东西,可以在那里使用正则表达式。
答案 2 :(得分:0)
我知道这是一篇旧帖子,但是有一个名为mapResources的路由方法,可以为你创建基于特殊方法的路由。
http://book.cakephp.org/2.0/en/development/rest.html
你把它放在routes.php中就像这样:
Router::mapResources(array('controller1', 'controller2'));
文档有一个漂亮的小表,显示请求如何映射到不同的操作,如果需要,您可以随时覆盖这些操作。