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

时间:2011-02-24 19:29:55

标签: 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]+')
);

现在我可以前往http://server/products/37/My-Product-Title并将它带到正确的地方。

但是,我如何获得反向路由以在$HtmlHelper->link中自动构建正确的网址?

当我使用时:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37)
);

它仍会输出标准products/view/37网址。

4 个答案:

答案 0 :(得分:5)

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

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

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

其中$ slug是来自slug字段的数据。

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

修改

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

在router.php中

添加以下规则:

Router::connect(
    '/product/*',
    array('controller' => 'products', 'action' => 'view')
);

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

您的链接应该像这样:

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

,链接看起来像:

http://yourdomain.com/product/37/my-product-title

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

答案 1 :(得分:3)

路由:

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

您的链接应如下所示:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 'id' => 37, 'slug' => 'my-product-title')
);

您必须为路由中的每个:param添加额外的(key =>值)数组。然后魔法会起作用

答案 2 :(得分:0)

您应该查看以下关于自定义路由类的帖子。

slug数据根本不需要涉及数据库 - 该字段是用于简化逻辑和查找的伪字段。此解决方案允许您反向路由段塞,而不需要在模型表中使用段塞字段。

http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls

答案 3 :(得分:-1)

我不确定这有多糟糕,但使用ProductsController中的以下代码:

function view($id)
{
    if( isset($_SERVER) && stristr($_SERVER["REQUEST_URI"],'view/') )
    {
        $this->Product->id = $id;
        $slug = $this->Product->field('slug');
        $this->redirect($id.'/'.$slug);
    }
    $data = $this->Product->find('first', array('conditions' => array('Product.id' => $id)));
    $this->set("data", $data);
}

如果通过/view/id访问该页面,它会使用/id/slug

自动将其重定向到当前页面

现在我可以使用默认链接方案:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37)
);

,它们将被重定向到正确的URL。

唯一的问题是我不确定每次用户访问产品页面时都会发生重定向有多糟糕?