【发布时间】:2018-03-12 15:17:33
【问题描述】:
我正在尝试在我的 API 平台项目中的一个实体上添加 KnpLabs Doctrine Behaviors - 准确地说是 Translatable Behavior。
这是我到目前为止所做的:
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 文档:
一切看起来都很好!但是当我查看数据库时:
在文章表中:
- 没有“本地”字段
- 没有“空”字段
在文章翻译表中:
- 没有“translatable_id”字段
- 没有“currentLocal”
- 没有“defaultLocal”
我猜它必须是链接的,但在招摇的 POST 选项卡中,模型也不同。
我只在这两个实体上尝试了 /GET 和 /POST 方法,它们都在工作(我可以在 DB 中看到它),但它们之间没有任何关系。
我希望我的帖子不会太长,但我尽量说得更具体!
提前致谢
【问题讨论】:
-
您找到解决方案了吗?我面临同样的问题。感谢您的帮助
-
@Tahir 仍未找到解决方案..
-
就我而言,订阅者未在捆绑列表中注册。我们需要按照documentation 中的说明注册订阅者捆绑包。修复此问题后,我得到了 db.xml 中的所有列。虽然我坚持如何使用默认端点发送/获取翻译。
标签: doctrine-extensions api-platform.com