2011-06-17 56 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

谢谢,但你错过了规范。我知道我可以手动制定规则来映射到每个页面。我试图用动态规则来避免这种情况。 –