在 Laravel 中自動維護 slug 欄位

心智極客發表於2019-10-14

Slug 是 URL 的一部分,使 URL 根據更具有可讀性,例如,這篇文章的英文標題為 Laravel Slug Trait,對應生成的 sluglaravel-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 協議》,轉載必須註明作者和本文連結

相關文章