2013-10-03 191 views
1

我如何CakePHP的前綴路由

domain.com/api/somecontroller/someaction 

domain.com/somecontroller/someaction 

指向同一個控制器動作:

class somecontroller { 

    function someaction() { 

    } 
} 

注:我不想重新路由只是一個動作。但是我想將所有路由的domain.com/api/*重新路由到它們對應的URL,而不用'api'前綴。

e.g:

domain.com/api/controller    -> domain.com/controller 
domain.com/api/controller/action  -> domain.com/controller/action 
domain.com/api/controller/action/param -> domain.com/controller/action/param 
domain.com/api/controller/action?key=val -> domain.com/controller/action?key=val 

我嘗試添加在routes.php文件如下:

Router::connect('/api', array('controller'=>'index', 'action'=>'index')); 
Router::connect('/api/:controller', array('action'=>'index')); 
Router::connect('/api/:controller/:action'); 
Router::connect('/api/:controller/:action.:ext'); 

它工作正常的定義的規則。但我似乎並未涵蓋所有情況。就像使用URL參數或插件和其他高級URL時失敗一樣。

有沒有更簡單的方法來完成我想要的任務?

+0

_「是否有更簡單的方法來完成我想要的任務?」是的,這就是所謂的mod重寫。 – Rob

+0

你不需要mod_rewrite,蛋糕路由系統負責一切。您可以使用通配符和佔位符,請參閱下面的答案。 – Happy

+0

無論你是否需要,mod重寫仍然是一種更好,更有效的方式來處理這種情況。只是在說... – Rob

回答

0

您不需要這4條規則,因爲您可以在CakePHP的路由系統中使用通配符(*)。

因此,在應用程序/配置/ routes.php文件添加只有一個規則將覆蓋你想要的一切..

Router::connect('/api/:action/*', array('controller' => 'mycontroller')); 

然後,每一個像http://domain.com/api/someaction要求,將在http://domain.com/mycontroller/someaction結束。

在我的代碼示例中,唯一需要更改的是控制器的名稱,上面指定了mycontroller

:你看動作部分基本上是在請求中指定的任何動作和*是通配符的佔位符。