33 lines
781 B
PHP
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;
|
|
}
|
|
}
|