ink/ink-sluggable

在Laravel 4中轻松为Eloquent和EloquentTranslatable模型创建slug。

dev-master 2014-01-11 18:48 UTC

This package is not auto-updated.

Last update: 2024-09-23 15:25:25 UTC


README

在Laravel 4中轻松为Eloquent和EloquentTranslatable模型创建slug。

背景:什么是slug?

slug是字符串的简化版本,通常对URL友好。对字符串进行“slug化”的操作通常涉及将其转换为单一种大小写,并删除任何非URL友好的字符(空格、重音字母、和号等)。生成的字符串可以用来标识特定的资源。

例如,我有一个包含文章的博客。我可以通过ID来引用每篇文章

http://example.com/post/1
http://example.com/post/2

...但这并不友好(特别是对于SEO)。你可能更愿意使用文章的标题作为URL,但如果文章的标题是“我与安德烈及弗朗索瓦的晚餐”,这看起来就太丑了

http://example.com/post/My+Dinner+With+Andr%C3%A9+%26+Fran%C3%A7ois

解决方案是为标题创建一个slug,并使用它代替。你可能想使用Laravel内建的Str::slug()方法将标题转换为更友好的格式

http://example.com/post/my-dinner-with-andre-francois

这样的URL会让用户更满意(可读性更强,更容易输入等)。

更多信息,你可以阅读维基百科上的这个描述

slugs通常是唯一的。所以如果我写了另一个具有相同标题的文章,我需要以某种方式区分它们,通常是在slug的末尾添加一个增量计数器

http://example.com/post/my-dinner-with-andre-francois
http://example.com/post/my-dinner-with-andre-francois-1
http://example.com/post/my-dinner-with-andre-francois-2

这保持了URL的唯一性。

为Laravel 4提供的包将自动处理所有这些,只需在开始时进行最少的配置。

安装

首先,您需要将包添加到composer.json文件中的require属性

{
    "require": {
        "ink/ink-sluggable": "dev-master"
    },
}

然后,从您的命令行运行composer update

然后,将'Ink\InkSluggable\InkSluggableServiceProvider',添加到app/config/app.php中的服务提供商列表,并将'Sluggable' => 'Ink\InkSluggable\Facades\Sluggable'添加到app/config/app.php中的类别名列表。

更新您的Eloquent模型

定义一个公开属性$sluggable,包含定义(有关详细信息,请参阅下面的[#配置])

class Post extends Eloquent
{

	public static $sluggable = array(
		'buildFrom' => 'title',
		'saveTo'    => 'slug',
	    'method'    => null,
	    'unique'    => false,
	    'onUpdate'  => false,
	);

}

就这样...您的模型现在是“可slug化”的!

使用类

保存模型很容易

$post = new Post(array(
	'title'    => 'My Awesome Blog Post'
));

$post->save();

检索slug也同样简单

echo $post->slug;

配置

配置被设计得尽可能灵活。

以下是一个示例配置,显示了所有默认设置

	public static $sluggable = array(
		'buildFrom' => 'title',
		'saveTo'    => 'slug',
	    'method'    => null,
	    'unique'    => false,
	    'onUpdate'  => false,
	);

buildFrom是从中构建slug的字段或字段数组。每个$model->field通过空格分隔连接起来,以构建可slug化的字符串。这可以是模型属性(即数据库中的字段)或自定义获取器。例如,这也可以工作

class Person extends Eloquent {

	public static $sluggable = array(
		'buildFrom' => 'fullname'
	);

	public function getFullnameAttribute() {
		return $this->firstname . ' ' . $this->lastname;
	}

}

如果buildFrom为空、false或null,则使用$model->__toString()的值。

saveTo是您的模型中存储slug的属性字段。默认情况下,这是“slug”。您需要在定义模式时创建此列。

Schema::create('posts', function($table)
{
	$table->increments('id');
	$table->string('title');
	$table->string('body');
	$table->string('slug');
	$table->timestamps();
});

method定义了将可slug化的字符串转换为slug的方法。此配置有三个可能的选项

  1. method为null(默认设置)时,该包使用Laravel的Str::slug()方法创建slug。

  2. method是一个可调用对象时,将使用该函数或类方法。函数/方法应期望两个参数:要处理的字符串和分隔符字符串。例如,要复制默认行为,可以这样做

	'method' => array('Illuminate\Support\Str','slug'),
  1. 您也可以将method定义为闭包(同样,期望两个参数)
	'method' => function( $string ) {
		return strtolower( preg_replace('/[^a-z]+/i', '-', $string) );
	},

method的其他值将抛出异常。

unique是一个布尔值,用于定义给定类型的所有模型中的slug是否应该是唯一的。例如,如果您有两个博客文章,并且它们的名称都是“我的博客文章”,那么它们都会根据Sluggable的默认设置sluggify为“my-blog-post”。这可能会成为问题,例如,如果您在URL中使用slug。

通过将unique设置为true,第二个Post模型将sluggify为“my-blog-post-1”。如果有一个标题相同的第三篇文章,它将sluggify为“my-blog-post-2”,依此类推。每个后续模型将在slug的末尾附加一个增量值,以确保唯一性。

onUpdate是一个布尔值。如果它是false(默认值),则如果模型被重新保存(例如,如果您更改博客文章的标题,则slug将保持不变)或slug值已经设置,则不会更新slug。您可以将它设置为true(或手动更改您自己的代码中的 $model->slug 值)以覆盖此行为。

错误和建议

请使用Github进行错误、评论和建议。优先考虑拉取请求!

版权和许可证

Eloquent-Sluggable由Colin Viebrock编写(由Orkhan Maharramli修改)并发布在MIT许可证下。有关详细信息,请参阅LICENSE文件。

版权所有2013 Colin Viebrock