2013-12-15 87 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')); 

的文檔有一個展示的請求是如何映射到不同的操作,您可以隨時如果重寫一個可愛的小表需要。