Files

33 lines
781 B
PHP

<?php
declare(strict_types=1);
namespace App\Support;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class SlugGenerator
{
/**
* 生成唯一 slug。中文标题自动回退为 $fallback 或 crc32 形式。
*/
public static function make(string $string, string $table, string $column = 'slug', ?int $ignoreId = null, ?string $fallback = null): string
{
$slug = Str::slug($string, '-', 'en');
if ($slug === '' || $slug === null) {
$slug = $fallback ?? $table.'-'.crc32($string);
}
$base = $slug;
$i = 2;
while (DB::table($table)->where($column, $slug)->where('id', '!=', $ignoreId ?? 0)->exists()) {
$slug = $base.'-'.$i++;
}
return $slug;
}
}