CakePHP - 如何使用slug进行反向路由?

JD *_*cks 5 php model-view-controller cakephp url-routing slug

我正在使用CakePHP 1.3.我有一个产品型号.对等的数据库表有idslug领域.

如果我有一个产品,是id:37slug:My-Product-Title我想要的网址为产品是:

产品/ 37 /我 - 产品名称

而不是标准:

产品/视图/ 37

我创建了一个如下所示的路线:

Router::connect(
    '/products/:id/:slug',
    array('controller' => 'products', 'action' => 'view'),
    array('pass' => array('id'), 'id' => '[0-9]+')
);
Run Code Online (Sandbox Code Playgroud)

现在我可以去http://server/products/37/My-Product-Title,它带我到正确的地方.

但是如何获得反向路由以自动构建正确的URL $HtmlHelper->link

我用的时候:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37)
);
Run Code Online (Sandbox Code Playgroud)

它仍然输出标准products/view/37网址.

Nik*_*kov 5

我不相信它可以自动神奇地完成.帮助程序只是一个"帮助者",它根据给定的参数构建链接.

所以最简单的方法是在链接中添加另一个参数,如下所示:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, $slug)
);
Run Code Online (Sandbox Code Playgroud)

$ slug是slug字段中的数据.

可能它可以完成你的想法,但你需要非常严重地打破MVC模式:)

编辑:

再次阅读你的问题,我理解得很清楚.看看应该怎么做:

在您的router.php中添加以下规则:

Router::connect(
    '/product/*',
    array('controller' => 'products', 'action' => 'view')
);
Run Code Online (Sandbox Code Playgroud)

请注意,它是/ product/*而不是/ products/*

您的链接应该像这样完成:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, 'my-product-title')
);
Run Code Online (Sandbox Code Playgroud)

并且链接看起来像:

http://yourdomain.com/product/37/my-product-title
Run Code Online (Sandbox Code Playgroud)

对我来说,你的建议是不好的做法.另外我认为从SEO的角度来看,总是用户重定向是不错的.