You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:05:26