symfony - 使用 API 平台配置 Gedmo Abstract Personal Translatable
问题描述
我希望获得 Abstract Personal Translations 以允许通过 API 平台持续存在,但它似乎不起作用。我的 json 帖子中的已翻译对象被完全忽略,而是将在要翻译的主要实体中传递的信息保留在默认语言环境中。
这是我的实体:语言实体
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\HasLifecycleCallbacks()
* @ApiResource(
* normalizationContext={"groups" = {"read"}},
* denormalizationContext={"groups" = {"write"}}
* )
* @ORM\Entity
* @Gedmo\TranslationEntity(class="LanguageTranslation")
*/
class Language
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"read"})
*/
private ?int $id = null;
/**
* @Gedmo\Translatable
* @ORM\Column(type="string", length=30)
* @Groups({"read", "write"})
*/
private $name;
/**
* @ORM\Column(type="boolean")
* @Groups({"read", "write"})
*/
private $isEnabled;
/**
* @ORM\Column(type="string", length=5)
* @Groups({"read", "write"})
*/
private $code;
/**
* @ORM\OneToMany(targetEntity=LanguageTranslation::class, mappedBy="object",cascade={"persist", "remove"})
* @Groups({"read", "write"})
*/
private $translations;
public function __construct()
{
$this->translations = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
......
public function getTranslations(): Collection
{
return $this->translations;
}
public function addTranslation(CategoryTranslation $t)
{
if (!$this->translations->contains($t)) {
$this->translations[] = $t;
$t->setObject($this);
}
}
}
语言翻译实体
<?php
namespace App\Entity;
use Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @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()
*/
class LanguageTranslation extends AbstractPersonalTranslation
{
/**
* @ORM\ManyToOne(targetEntity=Language::class, inversedBy="translations")
* @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $object;
/**
* @var string
*
* @ORM\Column(type="text", nullable=true)
* @Groups({"read", "write"})
*/
protected $content;
/**
* @var string
*
* @ORM\Column(type="string", length=8)
* @Groups({"read", "write"})
*/
protected $locale;
/**
* @var string
*
* @ORM\Column(type="string", length=32)
* @Groups({"read", "write"})
*/
protected $field;
public function __construct($locale, $field, $content)
{
$this->setLocale($locale);
$this->setField($field);
$this->setContent($content);
}
}
当我按如下方式向 api 发出 curl 请求时,我为翻译字段提供的值将被忽略。
curl -X 'POST' \
'http://localhost:8000/api/languages' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"name": "English",
"isEnabled": true,
"code": "en",
"translations": [
{
"content": "English",
"locale": "en",
"field": "name"
},
{
"content": "Englisch",
"locale": "de",
"field": "name"
}
]
}'
解决方案
类语言实现可翻译
在语言实体中,函数 addTranslation 调用不存在的 $t->setObject($this)。
添加到 LanguageTranslation 实体:
public function getObject(): ?TaskSet
{
return $this->object;
}
/**
* @param mixed $object
*/
public function setObject($object): void
{
$this->object = $object;
}
推荐阅读
- html - 如何使用 CSS 过渡属性创建滑动效果?
- datatables - 数据表中列的二级排序
- javascript - 剑道网格自动适应除特定列之外的列宽
- amazon-web-services - 降低从 S3 存储桶(多个存储桶)到我们的数据中心的传输费用
- javascript - Mongodb不尊重唯一的部分索引
- python - 维护一个视图的简单数据库?
- javascript - 映射深层嵌套对象数组 JSON 文件
- list - 我正在努力理解如何在 Haskell 中读取 concat
- javascript - 在 D3 中,如何在可缩放树状图中选择当前节点的特定子元素?
- python - 我怎么知道一个属性在哪里被调用?Python