From d483577c904ddfdba73623c703b14168b676c5a3 Mon Sep 17 00:00:00 2001 From: gouki Date: Mon, 12 Oct 2026 22:52:21 +0000 Subject: [PATCH] fix(tags): use crc32-fallback slugger for Chinese tag names (HasSlug was blanking slugs) --- app/Console/Commands/SablogImport.php | 2 +- app/Support/SlugGenerator.php | 10 ++++++++++ config/tags.php | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/SablogImport.php b/app/Console/Commands/SablogImport.php index 3d00897..c685a44 100644 --- a/app/Console/Commands/SablogImport.php +++ b/app/Console/Commands/SablogImport.php @@ -344,8 +344,8 @@ class SablogImport extends Command // 必须用 findFromString(内部按 locale 查询 JSON 键),否则每次导入都重复建标签 $tag = Tag::findFromString($tagName, 'post'); if (! $tag) { + // slug 由 spatie/tags 的 HasSlug 钩子用 tags.slugger(=SlugGenerator::slug)自动生成 $tag = new Tag(['name' => $tagName, 'type' => 'post']); - $tag->slug = SlugGenerator::make($tagName, 'tags', 'slug', fallback: 'tag-'.crc32($tagName)); $tag->save(); } diff --git a/app/Support/SlugGenerator.php b/app/Support/SlugGenerator.php index fa148b1..acd1484 100644 --- a/app/Support/SlugGenerator.php +++ b/app/Support/SlugGenerator.php @@ -10,6 +10,16 @@ use Illuminate\Support\Str; class SlugGenerator { + /** + * spatie/tags 的 tags.slugger 回调:拉丁字符用 Str::slug,纯中文名回退 crc32 形式。 + */ + public static function slug(string $string): string + { + $slug = Str::slug($string, '-', 'en'); + + return $slug === '' ? 'tag-'.crc32($string) : $slug; + } + /** * 生成唯一 slug。中文标题自动回退为 $fallback 或 crc32 形式。 */ diff --git a/config/tags.php b/config/tags.php index 7e86dc4..f8178ce 100644 --- a/config/tags.php +++ b/config/tags.php @@ -9,7 +9,7 @@ return [ * The given function generates a URL friendly "slug" from the tag name property before saving it. * Defaults to Str::slug (https://laravel.com/docs/master/helpers#method-str-slug) */ - 'slugger' => null, + 'slugger' => '\App\Support\SlugGenerator::slug', /* * The fully qualified class name of the tag model.