我正在尝试在我的 API 平台项目中的一个实体上添加KnpLabs Doctrine Behaviors - 准确地说是可翻译行为。
这是我到目前为止所做的:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
use ApiPlatform\Core\Annotation\ApiResource;
/**
* @ORM\Entity(repositoryClass="App\Repository\ArticleRepository")
* @ApiResource
*/
class Article
{
use ORMBehaviors\Translatable\Translation,
ORMBehaviors\Timestampable\Timestampable
;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
}
这是实体翻译:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Traits as CustomTraits;
/**
* @ORM\Entity(repositoryClass="App\Repository\ArticleTranslationRepository")
* @ApiResource
*/
class ArticleTranslation
{
use ORMBehaviors\Translatable\Translatable;
/**
* @var string
*
* @ORM\Column(name="someFieldToTranslate", type="string", length=255, nullable=true)
*/
private $someFieldToTranslate;
public function getSomeFieldToTranslate(){...}
public function setSomeFieldToTranslate($someFieldToTranslate){...}
}
这是根据文档使可翻译行为工作的基本“配置”。
当我尝试更新数据库架构时,问题就开始了:我收到了这个错误:
没有为实体“App\Entity\ArticleTranslation”指定标识符/主键。每个实体都必须有一个标识符/主键。(从“/Sites/bookshop-api/config/routes/api_platform.yaml”导入)。确保有一个
支持“api_platform”类型的加载器。
然而,在 Translatable Traits 中,已经有一个 ID 和文档精确地表明 Translation Entity 应该只包含我们想要翻译的字段......
无论如何,我已经为这个 ArtcleTranslation 实体添加了一个 ID 以消除错误:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Traits as CustomTraits;
/**
* @ORM\Entity(repositoryClass="App\Repository\ArticleTranslationRepository")
* @ApiResource
*/
class ArticleTranslation
{
use ORMBehaviors\Translatable\Translatable;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="content", type="string", length=255, nullable=true)
*/
private $content;
public function getContent(){...}
public function setContent($someContent){...}
}
从这里开始,当我更新数据库模式时没有错误。完美的 !现在我可以看一下 Swagger 文档:
一切看起来都很好!但是当我查看数据库时:
在文章表中:
- 没有“本地”字段
- 没有“空”字段
在 ArticleTranslation 表中:
- 没有“translatable_id”字段
- 没有“当前本地”
- 没有“默认本地”
我想它必须是链接的,但在大张旗鼓的 POST 选项卡中,模型也不同。
我只在这两个实体上尝试了 /GET 和 /POST 方法,它们正在工作(我可以在 DB 中看到它)但它们之间没有关系。
我希望我的帖子不会太长,但我试图更具体!
提前致谢