2012-07-10 49 views
2

擴展我想實現REST和parseExtension喜歡在我的應用程序的功能,而不必像http://myapp.dev/controller/action.json網址介紹CakePHP 2.運行使用前綴,而不是在CakePHP中

我想用http://myapp.dev/json/controller/action

其原因是,有時擴展看起來有點愚蠢,當把它放在像http://myapp.dev/controller/index/show:10/page:2.json這樣的東西。

雖然這可以在自定義路由中實現,但我已經有了很多自定義路由,並且不希望因爲維護原因而在其中創建每個具有:type字段的副本。

什麼是最理想的是設置它,使任何與/ json/xml/html等在第一位的網址將被視爲如json,xml,html等是擴展名。雖然前綴路由看起來很理想,但它需要新的方法(例如json_index,html_index等,我必須指定每種格式作爲單獨的前綴)。

有沒有這樣做的好方法?我只想parseExtensions而不是像parsePrefixes方法。

+0

一些替代方法是使用重寫規則,或將'/ show:10/page:2.json'更改爲'/action.json?show = 10&page = 2' – tigrang 2012-07-10 18:24:00

+0

後者不是特別令人滿意,醜陋,並沒有真正解決使用類似前綴的路線的問題。 我想過前者,但不確定如何解決這個問題,因爲我無法通過重寫規則將參數傳遞給CakePHP? – GTF 2012-07-11 00:20:20

回答

1

你應該嘗試以下操作:

Router::connect('/:ext/', array(':ext'), array('pass' => 'ext')); 
Router::connect('/:ext/:controller/*', array(':ext'), array('pass' => 'ext')); 
Router::connect('/:ext/:controller/:action/*', array(':ext'), array('pass' => 'ext')); 

然後,路由器會通過:EXT的說法,在路由參數的「外部」的價值。將它添加爲您的所有規則!

如果您想使用傳統路線工作,您需要使用自定義CakeRoute。在您的應用程序文件夾中創建一個文件 「/libs/routes/RestRoute.php」,添加以下到它:

class RestRoutes extends CakeRoute { 
    function parse($url) { 
     $params = parent::parse($url); 

     if (empty($params)) { 
      return false; 
     } 

     if(!in_array($params['ext'], Router::extensions())) { 
      return false; 
     } 

     return $params; 
    } 
} 

而在你/core/routes.php:

App::import('Lib', 'routes/RestRoute'); 
Router::connect('/:ext/', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute')); 
Router::connect('/:ext/:controller/*', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute')); 
Router::connect('/:ext/:controller/:action/*', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute')); 

所以,當您的自定義路由無法傳遞網址時,它會嘗試使用默認網址,而不使用外部參數。否則,參數的順序並不安靜。

也許不是最好的或更乾淨的解決方案,但這是一個好的開始。

+0

謝謝,這給了我幾個想法。我會放棄它。 – GTF 2012-07-24 21:51:38

+0

還有一個很好的插件,https://github.com/kvz/cakephp-rest-plugin,可以允許在json中強制擴展html。但該插件不再受支持,並且要求進行大量修改和更正才能使其正常工作。 – 2012-07-25 07:54:25

+1

嘗試過了,通過'/:ext/...'路線迄今爲止效果最好。我只是讓'ext'變量作爲一個命名變量,因爲'Router :: parseExtensions()'自動工作。謝謝! – GTF 2012-08-21 16:46:39

相關問題