在CodeIgniter中使用“slugs”

16

我听说有人使用“slug”来生成干净的URL。但我不知道它是如何工作的。 目前,我的CodeIgniter网站生成的URL看起来像这样:

www.site.com/index.php/blog/view/7

据我所知,通过维护一个slug字段可以实现像这样的URL:

www.site.com/index.php/blog/view/once-upon-a-time

这个如何实现?特别是在使用codeigniter时?


您可以使用 Eric Barnes 的 CI Slug Library:https://github.com/ericbarnes/CodeIgniter-Slug-Library - alpere
2个回答

55

我只是把slug存储在数据库表中的一个名为slug的列中,然后通过slug查找文章,就像这样:

public function view($slug)
{
    $query = $this->db->get_where('posts', array('slug' => $slug), 1);

    // Fetch the post row, display the post view, etc...
}

另外,要从文章标题轻松获取slug,只需使用URL助手中的url_title()函数:

// Use dashes to separate words;
// third param is true to change all letters to lowercase
$slug = url_title($title, 'dash', true);

一个小奖励:您可能希望在 slug 列上实现唯一键约束,以确保每个帖子都有一个唯一的slug,这样CodeIgniter就不会犹豫要查找哪篇文章。当然,您应该首先为您的帖子提供唯一的标题,但是实施此措施强制规则并防止您的应用出现问题。


2
这正是我会做的方式,但我有点担心这种类型的URL的性能。比如你有一个像Stackoverflow上的URL:/questions/{integer}/{slug},不是使用第一种类型的URL更有效率吗?因为对于第一种类型的URL,你可以简单地使用数据库中的主键进行更快速的搜索。而对于另一种URL,你需要进行字符串比较,这肯定会更慢。 - EsTeGe
@EsTeGe:没错。如果性能是一个问题,你会想要坚持使用快速的索引/键来查询。然而,如果它不是关键的或者你有一些合理的缓存机制来减轻数据库的负担,你可以选择使用短标识(slug)。 - BoltClock
哦,我没有考虑到CodeIgniter的内置缓存功能。它基于URL,因此就少了一个要担心的查询。 - EsTeGe

3
给我的西班牙朋友们,使用Text Helper中的方法来去除带重音的字符:


 $string = 'áéíóú ÁÉÍÓÚ';   
 $slug = url_title(convert_accented_characters($string), 'dash', true); //convert_accented_characters function will deal with the accented characters.
 echo $slug; //aeiou-AEIOU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接