致力于构建 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
最佳答案
我最终不得不手动编写路由:
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 中的任何扩展名——如果它因为调用的原因而重定向错了,我只是想让它返回主页(或其他)并使用普通 View 。
关于rest - 在 CakePHP 中使用带有 RESTful 路由的路由前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20601162/