CakePHP Routing - [home]/slug as URL

问题描述:

我试图去掌握Cake的路由,但我没有找到解决方案来解决我的特定问题。CakePHP Routing - [home]/slug as URL

我想将www.example.com/slug映射到www.example.com/venues/view/slug,其中slug是特定场地记录的URL友好名称。

我还想将www.example.com/slug/events映射到www.example.com/events/index/venue:slug。

在阅读有关路由的CakePHP文档之后,我几乎没有更明智的了。我知道如何为每个单独的场地创建这些路线,但我不确定如何让Cake在运行中生成路线。

您想要小心地将某些东西映射到域名后的第一个路径。这意味着你将打破控制器/动作/参数/参数范例。你可以这样做,但这可能意味着你需要在你的路由文件中为你的站点定义每个url,而不是使用Cake的路由魔术。

另一种可能是使用/ v /为场地和/ e /为事件保持你的网址短,但打破了正常范式的网址。

如果你仍然想要做你在这里所要求的,你可以做如下的事情。它限制了字母,数字,破折号和下划线。

Router::connect(
    '/:slug', 
    array(
     'controller' => 'venues', 
     'action' => 'view' 
     ), 
    array(
    'slug' => '[a-zA-Z0-9_-]+' 
    ) 
); 
Router::connect(
    '/:slug/:events', 
    array(
     'controller' => 'events', 
     'action' => 'index' 
     ), 
    array(
    'slug' => '[a-zA-Z0-9_-]+' 
    ) 
); 

在您的控制器中,您将使用以下命令(使用第一个路径作为示例)访问slug。

function view(){ 
    if(isset($this->params['slug'])){ 
     //Do something with your code here. 
    } 
} 

首先,您没有将www.example.com/slug连接到www.example.com/venues/view/slug,您将/slug连接到控制器操作。就像这样:

Router::connect('/:slug', 
       array('controller' => 'venues', 'action' => 'view'), 
       array('pass' => array('slug')); 

要产生相应的链接,你会做同样的反向:

$this->Html->link('Foo', 
     array('controller' => 'venues', 'action' => 'view', 'slug' => 'bar')) 

这应该导致链接/bar

路由/:slug URL的问题在于它是一条无所不包的路由。您需要在此之前仔细定义您可能想要使用的所有其他路线。

+1

的人需要有一个[自定义路由类](http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp) – Dunhamzzz 2011-06-02 12:32:56

+0

@Dunham现在是吗?做什么的? – deceze 2011-06-02 13:09:44

+0

正如您所说,现在正在捕捉所有路线。 – Dunhamzzz 2011-06-02 13:16:26