CakePHP路由 - [home] / slug作为URL

时间:2011-06-02 11:25:11

标签: cakephp routing cakephp-1.3

我正在努力掌握Cake的路由,但我没有找到解决我的特定问题的运气。

我想将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动态生成路线。

2 个答案:

答案 0 :(得分:9)

您要小心将某些内容映射到域名后的第一个路径。这意味着您将破坏controller / action / param / param范例。您可以这样做,但这可能意味着您需要在路径文件中定义站点的每个URL,而不是使用Cake的路由魔法。

替代方案可能是使用/ v /用于场地和/ e /用于事件以保持您的网址短,但打破正常范例的网址。

如果您仍想在此处执行此操作,则可以执行以下操作。它将slug限制为字母,数字,破折号和下划线。

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.
    }
}

答案 1 :(得分:3)

首先,您没有将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网址的问题在于它是一个包罗万象的路线。您需要仔细定义在此之前可能要使用的所有其他路线。