Symfony5 / KnpLabs / DoctrineBehaviors / 不记录翻译

Symfony5 / KnpLabs / DoctrineBehaviors / don't record the translation

我正在尝试在 Symfony 5.2 中实现 KnpLabs/DoctrineBehaviors/Translatable。

我按照这个例子: https://github.com/KnpLabs/DoctrineBehaviors/blob/master/docs/translatable.md

我创建了 CategoryCategoryTranslation 实体作为示例。并正确执行bin/console doctrine:schema:update --force

当我在 Controller 中实施时,似乎一切正常,但 table CategoryTranslation(在 mysql 上)是空的。


// DefaultController.php

use App\Entity\Category; 
use App\Entity\CategoryTranslation; 

public function default()
    {

        $em = $this->getDoctrine()->getManager();
 
        $category = new Category();
        $category->translate('fr')->setName('Chaussures');
        $category->translate('en')->setName('Shoes');

        $em->persist($category);
        $em->flush();

    }

结果:table Category 有 1 条记录 id:1 但 CategoryTranslation table 为空。

没用。

我粘贴了两个实体,但它们与示例相同:

<?php

declare(strict_types=1);    

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait;

/**
 * @ORM\Entity
 */
class Category implements TranslatableInterface
{
    use TranslatableTrait;
    
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $someFieldYouDoNotNeedToTranslate;
    
    public function getId(): ?int
    {
        return $this->id;
    }
}
<?php

declare(strict_types=1);    

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslationTrait;

/**
 * @ORM\Entity
 */
class CategoryTranslation implements TranslationInterface
{
    use TranslationTrait;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $name;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $description;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getDescription(): string
    {
        return $this->description;
    }

    public function setDescription(string $description): void
    {
        $this->description = $description;
    }
}

知道发生了什么事吗?

谢谢

您缺少 mergeNewTranslations()

如您提供的 link 中的代码所述。

<?php

declare(strict_types=1);

/** @var \Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface $category */
$category = new Category();
$category->translate('fr')->setName('Chaussures');
$category->translate('en')->setName('Shoes');

$entityManager->persist($category);

// In order to persist new translations, call mergeNewTranslations method, before flush
$category->mergeNewTranslations();

$category->translate('en')->getName();

需要打电话给

$category->mergeNewTranslations();

在刷新到数据库之前,否则翻译将不会被保留。