Laravel Filament v3使用spatie翻译插件时user_id翻译错误求助
解决Laravel Filament v3 + Spatie Translatable插件的user_id翻译错误问题
问题原因
出现该错误是因为系统尝试将user_id作为翻译字段处理,但它并未加入Post模型的$translatable数组。大概率是以下两种情况:
- 表单中
user_id字段被错误放置在TranslatableSection/TranslatableForm组件内部,导致Filament自动将其包装为多语言数组格式 - 在
mutateFormDataBeforeCreate中设置user_id后,插件错误地将其纳入翻译处理流程
解决方案
方案1:使用模型事件设置user_id(推荐)
绕过Filament表单数据处理流程,直接在模型创建前通过事件设置user_id,避免被多语言插件干扰:
// app/Models/Post.php protected static function booted(): void { static::creating(function (Post $post) { $post->user_id = auth()->id(); }); }
然后移除CreatePost类中mutateFormDataBeforeCreate方法里的$data['user_id'] = auth()->id();代码。
方案2:调整表单结构,确保user_id不被翻译组件处理
如果需要在Filament表单中处理user_id,确保它不在翻译相关组件内:
// app/Filament/Resources/PostResource/Pages/CreatePost.php public function form(Form $form): Form { return $form ->schema([ // 普通字段放在TranslatableSection外面 Forms\Components\Hidden::make('user_id') ->default(fn () => auth()->id()), Forms\Components\TranslatableSection::make('Translatable Content') ->schema([ // 这里放需要翻译的字段:title, slug等 Forms\Components\TextInput::make('title'), Forms\Components\TextInput::make('slug'), // ...其他翻译字段 ]), ]); }
这种方式直接通过default设置user_id,无需在mutate方法中额外处理。
方案3:修正mutate方法的数据处理
如果必须保留mutateFormDataBeforeCreate方法,确保user_id以普通 scalar 值传递,避免被插件误处理:
// app/Filament/Resources/PostResource/Pages/CreatePost.php protected function mutateFormDataBeforeCreate(array $data): array { // 先提取可能被错误包装的user_id值(如果存在) if (isset($data['user_id']) && is_array($data['user_id'])) { // 取任意语言的value,因为所有语言值都是同一个user_id $data['user_id'] = reset($data['user_id']); } else { $data['user_id'] = auth()->id(); } return $data; }
内容的提问来源于stack exchange,提问作者Guest Guest Guest
相关产品推荐
相关产品推荐

