2011-06-17 60 views
1

我嘗試爲頁面控制器創建搜索引擎友好的URL,即​​而不是/pages/about在CakePHP中爲PagesController路由搜索引擎友好的URL

我試圖建立以下途徑(在routes.php文件的底部):

Router::connect('/*', array('controller' => 'pages', 'action' => 'display')); 

Router::connect('/:page', array('controller' => 'pages', 
    'action' => 'display'), array('pass' => array('page'), 'page' => '[a-z]+')); 

兩者搭配得當​​,/support等。然而,失敗當我有一個行動/方法對。例如,/contact應該路由到PagesController->contact()。然而,上面的路由到PagesController->display()

必須有一種方法可以在不爲每個頁面制定特定路線的情況下完成此操作。我如何創建一條路線或一組路線:

  • 模仿 PageController的默認路由行爲。這是路由 要顯示(),除非存在一個動作/方法 對。
  • 這樣做與搜索引擎友好的URL。這是從根/而不是/pages
  • 展示兩個Router::connect()Html->link()

我在CakePHP Book檢查例子和觀看其他問題,如CakePHP routing in pages controller。似乎沒有什麼能滿足上述規範。

+0

'/ *'?除了PagesController之外,您還在應用程序中使用其他控制器嗎? – webbiedave

+0

@webbiedave是的。 –

+0

那麼,如果'/ xyz'應該調用'XYZController-> index()'而不是'PagesController-> xyz()',Cake怎麼會知道?這就是爲什麼你必須明確列出頁面不是嗎? – webbiedave

回答

0

您需要爲contact方法調用創建第二個路由,並將其放在更通用的規則之前,以匹配「/ pages後面的所有內容[a-z]」。嘗試在您的規則之前:

Router::connect('/contact', array('controller' => 'pages', 'action' => 'contact')); 

請務必記住,路線順序非常重要。更通用的規則是它會匹配得越多。因此,在更通用的規則前面加上更具體的規則。

+0

謝謝,但你錯過了規範。我知道我可以手動制定規則來映射到每個頁面。我試圖用動態規則來避免這種情況。 –