2011-04-27 41 views
0

我嘗試連接下一個網址:CakePHP的路由器:連接,我沒有得到語法

1)/food/tips
2)/happiness/tips/best_tips

以下對象:
1)controller=tips/action=index/passed_parameters=food
2)controller=tips/action=index/passed_parameters=(happiness,best_tips)

- 編輯 -
這些路線不固定。
含義:我試圖做的是將具有tips作爲動作的每個url路由到提示控制器,到任何固定的(索引足夠好的)動作,並鏈接原始調用中的其餘url 。 喜歡的東西/any_controller/tips/any_param/tips/index/any_params
- 編輯完 -

希望,現在有一些感覺。

應該怎麼做? (請 - 也解釋)

感謝

回答

1

路由全部通過調用Router :: connect('catch to','where send to');

所以可以簡單:

Router::connect('/food/tips', '/tips/index/food'); 

或優選的方法(使用內建在網址構建蛋糕)

Router::connect('/food/tips/*', array('controller' => 'tips', 'action' => 'index', 'food'); 

第一種方法採用一個字符串參數,並把它傳遞給另一字符串,這將是一個網址,你將不得不趕上你的控制器,並期望通過URL傳遞參數。

第二種方法使用內置URL前這需要用鑰匙控制器和動作的陣列的蛋糕(還有其他選擇:http://api.cakephp.org/class/router#method-Routerurl) 第二優選由於正確的格式和未來的靈活性(I相信)。

第二種方法中的任何傳遞參數都只是作爲數組中未命名的項目傳遞。命名參數僅作爲鍵控元素傳遞。所以,如果我想創建這樣一個URL這個

/職位/索引/查找:所有/頁:2

我會寫這樣的網址:

Router::connect('/url_to_catch', array('controller' => 'posts', 'action' => 'index', 'find' => 'all', 'page' => 2); 

所以只是爲了完成,我實際上將通過你的參數通過命名:

Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'items' => array('happiness', 'best_tips')); 

這將需要一個有趣的在你的提示控制器中,看起來像這樣:

function tips(){ $this->passedArgs['items']; } 
1

這是很容易,只是檢查Router configuration in the manual。您必須使用Router類中的connect方法。這接受2個參數。首先您需要的路由(例如food/tips),然後是第二個具有應該遵循的實際路徑的陣列。因此,對於你的例子你會做這樣的事情:

Router::connect('/food/tips', array('controller' => 'tips', 'action' => 'index', 'food'); 
Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'happiness', 'best_tips'); 

這分別相當於調用TipsController->index('food')TipsController('happiness', 'best_tips)

但是,您的路線看起來有點有趣。路由的Cake約定是/controller/action/param1/param2/etc,其中參數param1等是可選的,並且在沒有給出其他動作時採取index動作。

您採取了不同的方法,我建議(如果可以的話)將其更改爲Cake常規路由,因爲這將爲您節省大量工作,因爲Cake會自動將這些路由連接到所需的方法。

所以我的建議是tips/foodtips/happiness/best_tips而不是你建議的路線。這樣,你不必做任何路由器配置。

UPDATE

後你是編輯,我認爲這是最好的嘗試一些與defining custom routes。我不能在此刻測試這個給你,所以你應該做一些測試自己,但在這種情況下,它會是這樣的:

Router::connect('/:section/tips/:param', 
    array('action' => 'index'), 
    array(
     'section' => '[a-z]*', 
     'param' => '[a-z]*' 
    ) 
); 

UPDATE2

對不起,我測試過上面和它似乎沒有工作。

+0

啊你打我吧!我想我輸入緩慢;) – 2011-04-27 15:26:59

+0

謝謝@ vindia,這不是解決我的問題(我的錯,我會編輯原來的問題) 至於約定,我的問題是,我有一個提示控制器,但沒有提示部分。 。所以我需要將每個'節/提示'路由到提示控制器... – yossi 2011-04-27 16:06:44

+0

謝謝,我嘗試了幾個教程和guides.same結果。無法路由基於動作值的控制器..不知道爲什麼 – yossi 2011-04-28 14:55:45

1

我會推薦閱讀關於路由本書的章節,因爲它會解釋比我更好的東西,而且在這裏粘貼它似乎反作用。

http://book.cakephp.org/#!/view/948/Defining-Routes

爲了解釋起見,我會嘗試,

Router::connect('/food/tips', array('controller' => 'tips', 'action' => 'index', 'food')); 
Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'happiness','best_tips')); 

這應該讓爲你工作的事情。你實際上做的是告訴Cake Routing你想要捕獲哪個url,因爲它會使用Regex來做這件事。然後你想告訴它你想讓它運行哪個代碼。因此,這需要一個Controller和Action對,作爲一組要做的事情。

之後你也想通過你的命名參數。這些將會添加到控制器中的功能,以便您可以對它們進行操作。

+0

感謝@DavidYell,當我寫給@ vindia時,我將編輯該問題。 – yossi 2011-04-27 16:07:41

+0

是的,我認爲你試圖達到的是不好的。從Cake的角度來看非常糟糕。你會發現它很難。我建議爲此搜索堆棧。 – 2011-04-27 17:04:42

+0

@DavidYell - 「搜索」堆棧?含義? – yossi 2011-04-27 17:16:32