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
我创建了 Category
和 CategoryTranslation
实体作为示例。并正确执行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();
在刷新到数据库之前,否则翻译将不会被保留。
我正在尝试在 Symfony 5.2 中实现 KnpLabs/DoctrineBehaviors/Translatable。
我按照这个例子: https://github.com/KnpLabs/DoctrineBehaviors/blob/master/docs/translatable.md
我创建了 Category
和 CategoryTranslation
实体作为示例。并正确执行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();
在刷新到数据库之前,否则翻译将不会被保留。