2012-10-10 173 views
1

我是CakePHP的新手,我希望在我的應用中重寫我的網址。Cakephp網址路由

對於我想要導航的一些控制器。

`controller/action/id/slug`. 

爲了這個,我寫的規則爲,

Router::connect(
     '/products/:id/:slug', array('controller' => 'products', 'action' => 'view'), array('pass' => array('id'), 'id' => '[0-9]+') 
); 

我寫的環節..

echo $this->Html->link($record['Category']['name'], array('controller' => 'categories', 'action' => 'index', 'slug' => $record['Category']['slug']), array('escape' => false)); 

問題

  1. 是規則只適用於提到的控制器和行動即產品和vi ew resp。 ?

  2. 爲什麼我的網址(懸停時)顯示爲controller/action/slug:slug_name而不是controller/action/slug_name

  3. 在同一控制器我想使用不同的URL重寫如action/id/slug_name或某處我發送/action或某處我只使用蛞蝓action/slug_name。唯一的規則是爲所有人寫的嗎?或者我必須爲每個控制器和操作定義單獨的規則。

  4. 爲所有控制器創建通用規則?

請說明更多。我試圖閱讀文檔,但有點困惑。我的參數如何得到我提到的各種類型的請求。

寫現在我只用簡單的方法來獲取PARAMS作爲

controller/action/param1:param_val1/param2:param_val2, 
echo $this->Html->link('Val', array('controller' => 'categories', 
'action' => 'index', 'param1' => param_val1, 'param2' => param_val2,), 
array('escape' => false)); 

等。但我希望有更漂亮的網址以及更好更快的移動。就像傳遞slu I一樣,我希望直接獲取findBySlug或某種方式使它更好。

回答

3

1)是的,當你創建一個路由器::連接規則只適用於一種情況,即適用於一個網址或組操作系統URL。

2)你應該做這樣

echo $this->Html->link($record['Category']['name'], array('controller' => 'categories', 'action' => 'index', $record['Category']['slug']), array('escape' => false)); 

3)必須爲這些網址建立規則,只有當URL的結構是不同的

與你的例子根據的規則如下

# only for action/slug_name case 
Router::connect('/products/:slug', array('controller' => 'products', 'action' => 'view'), array('pass' => array('slug'), 'slug'=>'[a-z_]+')); 
# for action/id/slug_name case 
Router::connect('/products/:id/:slug', array('controller' => 'products', 'action' => 'view'), array('pass' => array('id','slug'), 'id' => '[0-9]+','slug'=>'[a-z_]+')); 

4)我建議你在不使用CakePHP的HTML組件的情況下編寫URL。不是因爲它不好,而是因爲它是更快,更容易

,而不是做這個

controller/action/param1:param_val1/param2:param_val2, 
echo $this->Html->link('Val', array('controller' => 'categories','action' => 'index', 'param1' => param_val1, 'param2' => param_val2,),array('escape' => false)); 

更好的做到這一點:

controller/action/param_val1/param_val2 

echo 'controller/action/'.$param_val1.DS.$param_val2; 

而且是爲了更好的SEO和網址友好型