2010-07-29 72 views
1

來自Django,我習慣於能夠以我認爲合適的方式來組織我的URL路由。例如,用戶註冊將存在於/users/網址下。如何爲CakePHP控制器中的某些操作創建自定義路由?

/users/ 
/users/registration/ 
/users/registration/optin/ 
/users/registration/thankyou/ 

不過,我創造CakePHP中,用戶註冊系統和URL路由的默認慣例的行爲是/controller/action/。這產生了:

/users/ 
/users/registration/ 
/users/optin/ 
/users/thankyou/ 

我如何能實現一些自己的行爲(其中/custom/是一個小節,沒有一個參數)的/controller/action/custom/風格的URL路由?我是否應該期待這樣做,還是我只是在與這個大會作鬥爭呢?

回答

2

/controller/action/custom/默認工作正常。
它調用ControllerController::action('custom')

如果你正在尋找的東西想通過URL /users/registration/thankyou調用UsersController::thankyou(),可以進行適當的途徑:

Router::connect('/users/registration/thankyou', 
       array('controller' => 'users', 'action' => 'thankyou')); 

您可以將路線在一個規則是這樣的:

// Routes /users/registration/optin and /users/registration/thankyou to 
// UsersController::optin() and UsersController::thankyou() respectively 
Router::connect('/users/registration/:action', 
       array('controller' => 'users'), 
       array('action' => '(optin|thankyou)')); 

在Cake中路由功能非常強大,完全靈活。與往常一樣,學習手冊:
http://book.cakephp.org/view/945/Routes-Configuration


的基礎是路由器的路由,例如匹配'/users/registration/:action',針對當前URL,包括第三個參數中指定的條件,例如'action' => '(optin|thankyou)':action部分必須與RegEx /^(optin|thankyou)$/匹配)。
如果匹配,它會將第二個參數的默認值與從URL中提取的任何信息合併,例如,您將獲得array('controller' => 'users', 'action' => 'thankyou')
然後它通過CakeRoute::parse,它構建了在控制器中執行debug($this->params)時可以看到的陣列。該數組用於確定要加載哪個Controller以及要調用哪個動作。

基本正則表達式和參數匹配功能已經非常強大,但您可以通過繼承CakeRoute並提供自定義parse函數完全瘋狂,正如手冊末尾所簡述的那樣。 :)

+0

我一直在閱讀路線,但作爲Cake的新手,很多組件之間的連接並不總是很明顯。 Cake先生做了很多魔術,這讓我想知道當我需要移出常規時它究竟在做什麼。 (我正在閱讀食譜,但我只能讀得這麼快) – Soviut 2010-07-29 03:25:23

+0

@Soviut是的,這是一個非常複雜的話題,直到你得到它。增加了一些關於魔術的更多解釋,希望有所幫助。 – deceze 2010-07-29 03:49:31

+1

謝謝。你有我的投票和我的接受!我只希望Cake文檔能夠告訴我完成任何事情的艱難方法,然後向我展示簡單的方法。首先顯示簡單的方法傾向於平息人們,然後當他們需要在公約之外做事時卡住。 – Soviut 2010-07-29 05:09:03

相關問題