API Platform配置Gedmo Abstract Personal Translatable实现翻译持久化问题排查
问题排查与修复方案
1. 修复addTranslation方法参数类型错误
你当前Language实体中的addTranslation方法参数写死为CategoryTranslation类型,和实际关联的LanguageTranslation不匹配,Symfony序列化组件在反序列化translations集合时,找不到类型匹配的adder方法,直接跳过了该字段的处理。
修改后的代码:
// 替换原有的addTranslation方法,同时补充配套的removeTranslation方法,序列化组件处理集合需要成对的adder/remover public function addTranslation(LanguageTranslation $t) { if (!$this->translations->contains($t)) { $this->translations[] = $t; $t->setObject($this); } } public function removeTranslation(LanguageTranslation $t): void { $this->translations->removeElement($t); }
2. 让Language实体实现Translatable接口
Gedmo的个人翻译需要主实体实现Gedmo\Translatable\Translatable接口,同时引入对应trait:
use Gedmo\Translatable\Translatable; use Gedmo\Translatable\Traits\Translatable as TranslatableTrait; class Language implements Translatable { use TranslatableTrait; // 原有代码保持不变 }
3. 修正LanguageTranslation实体的序列化配置
你当前给LanguageTranslation加了@ApiResource()注解但没有指定序列化组,导致反序列化时无法识别write组的字段。不需要直接暴露翻译实体接口的话直接删掉该注解即可,需要单独暴露的话补充上下文配置:
/** * @ORM\Entity * @ORM\Table(name="language_translations", * uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={ * "locale", "object_id", "field" * })} * ) * @ORM\Entity(repositoryClass="Gedmo\Translatable\Entity\Repository\TranslationRepository") * @ApiResource( * normalizationContext={"groups" = {"read"}}, * denormalizationContext={"groups" = {"write"}} * ) */ class LanguageTranslation extends AbstractPersonalTranslation { // 原有代码保持不变 }
4. 确认Gedmo扩展配置
在config/packages/stof_doctrine_extensions.yaml中开启个人翻译支持:
stof_doctrine_extensions: default_locale: '%kernel.default_locale%' translation_fallback: true orm: default: translatable: true personal_translation: enabled: true
修复完成后重新发起请求,translations字段就会被正常反序列化、关联到主实体后持久化到翻译表。
内容的提问来源于stack exchange,提问作者Masinde Muliro
相关产品推荐
相关产品推荐

