首页 > 解决方案 > 使用 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"
        }
      ]
    }'

标签: symfonydoctrine-ormapi-platform.com

解决方案


类语言实现可翻译

在语言实体中,函数 addTranslation 调用不存在的 $t->setObject($this)。

添加到 LanguageTranslation 实体:

public function getObject(): ?TaskSet
  {
    return $this->object;
  }

  /**
   * @param mixed $object
   */
  public function setObject($object): void
  {
    $this->object = $object;
  }

推荐阅读