Slug 是 URL 的一部分,使 URL 根據更具有可讀性,例如,這篇文章的英文標題為 Laravel Slug Trait
,對應生成的 slug
為 laravel-slug-trait
,那麼,如何在 Laravel 中自動維護 slug 欄位呢,以下是簡單的實現。
定義遷移欄位
通常,我們這樣定義 slug
欄位
$table->string('slug')->unique()->comment('url slug');
可將其進行封裝
// /app/Providers/AppServiceProvider.php
use Illuminate\Database\Schema\Blueprint;
Blueprint::macro('sluggable', function ($column = 'slug') {
return static::string($column)->unique()->comment('url slug');
});
快速使用
$table->sluggable();
定義 Trait
Laravel
自帶模型事件以及實用函式即可實現該功能
<?php
namespace App\Models\Concerns;
use Illuminate\Support\Str;
trait Sluggable
{
public static function bootSluggable()
{
static::saving(function ($model) {
$attribute = $model->sluggable();
$model->$attribute = Str::slug(
$model->getAttribute($attribute)
);
});
}
/**
* Slug 欄位
*
* @return string
*/
abstract public function sluggable(): string;
}
使用
<?php
namespace App\Models;
class Post extends Model
{
use Concerns\Sluggable;
/**
* 文章標題作為 Slug 欄位
*
* @return string
*/
public function sluggable() : string
{
return 'title';
}
/**
* 指定路由模型繫結的的鍵為 slug
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結