ink / ink-sluggable
在Laravel 4中轻松为Eloquent和EloquentTranslatable模型创建slug。
Requires
- php: >=5.3.0
- illuminate/config: ~4.0
- illuminate/support: ~4.0
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的方法。此配置有三个可能的选项
-
当
method
为null(默认设置)时,该包使用Laravel的Str::slug()
方法创建slug。 -
当
method
是一个可调用对象时,将使用该函数或类方法。函数/方法应期望两个参数:要处理的字符串和分隔符字符串。例如,要复制默认行为,可以这样做
'method' => array('Illuminate\Support\Str','slug'),
- 您也可以将
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