Laravel中Spatie可翻译Slug路由模型绑定404问题排查
解决Laravel Sluggable + Translatable 路由模型绑定404问题
以下是针对你的问题的核心配置修复方案:
- 重写模型的路由绑定解析逻辑
默认路由模型绑定只会匹配字符串类型的slug字段值,而你的slug存储在JSON字段中(对应不同语言的键值对)。需要在模型中自定义解析规则,让Laravel根据当前语言查询对应slug:
// 示例模型(如Post.php) use Illuminate\Database\Eloquent\Model; use Spatie\Sluggable\HasSlug; use Spatie\Sluggable\SlugOptions; use Spatie\Translatable\HasTranslations; class Post extends Model { use HasSlug, HasTranslations; // 声明可翻译字段,必须包含slug public $translatable = ['title', 'slug']; public function getSlugOptions(): SlugOptions { return SlugOptions::create() ->generateSlugsFrom('title') // 基于对应语言的title生成slug ->saveSlugsTo('slug'); // 将多语言slug存入JSON字段 } // 自定义路由绑定解析 public function resolveRouteBinding($value, $field = null) { if ($field === 'slug') { // 按当前语言查询JSON字段中的slug值 return $this->where("slug->".app()->getLocale(), $value)->firstOrFail(); } return parent::resolveRouteBinding($value, $field); } }
- 明确路由的绑定字段
在路由定义中指定用slug字段进行模型绑定,避免Laravel默认使用主键查询:
// routes/web.php use App\Models\Post; Route::get('/posts/{post:slug}', function (Post $post) { return view('posts.show', compact('post')); });
- 验证Slug生成逻辑
创建模型时确保对应语言的slug已正确生成,比如切换语言后创建多语言数据:
app()->setLocale('nl'); Post::create([ 'title' => ['nl' => 'Voorbeeld Titel', 'en' => 'Example Title'], // 其他业务字段 ]);
- 检查数据库存储格式
确认slug字段为JSON类型,存储结构符合预期:
{"nl": "voorbeeld-titel", "en": "example-title"}
内容的提问来源于stack exchange,提问作者Hardist
相关产品推荐
相关产品推荐

