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

CakePHP路由-[home]/slug作为URL,cakephp,routing,cakephp-1.3,Cakephp,Routing,Cakephp 1.3,我正在努力掌握蛋糕的路线,但我没有找到解决我的特殊问题的方法 我想将www.example.com/slug映射到www.example.com/victions/view/slug,其中slug是特定场馆记录的URL友好名称 然后我还要将www.example.com/slug/events映射到www.example.com/events/index/vention:slug 在阅读了关于路由的CakePHP文档几遍之后,我一点也不聪明。我知道我将如何为每个场馆创建这些路线,但我不确定如何让

我正在努力掌握蛋糕的路线,但我没有找到解决我的特殊问题的方法

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

然后我还要将www.example.com/slug/events映射到www.example.com/events/index/vention:slug


在阅读了关于路由的CakePHP文档几遍之后,我一点也不聪明。我知道我将如何为每个场馆创建这些路线,但我不确定如何让Cake动态生成路线。

首先,您没有将www.example.com/slug连接到www.example.com/vinces/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的问题在于它是一个包罗万象的路由。在此之前,您需要仔细定义可能要使用的所有其他路由。

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

另一种方法可能是对场馆使用/v/和对活动使用/e/以保持url简短,但将url分解为正常模式

如果你仍然想做你在这里要求的事情,你可以做如下的事情。它将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(以第一条路径为例)


这个人现在需要一个@Dunham吗?为什么?正如你所说,它现在正在捕获所有路由。谢谢你的评论-我没有完全理解路由中的传递参数。我看到了与某物联系的困难。我最初的想法是以某种方式询问数据库是否/无论什么是slug,如果不是,则让cake执行其默认操作/场地/子弹!
function view(){
    if(isset($this->params['slug'])){
        //Do something with your code here.
    }
}