API 平台 - 提供的值无效(IRI 无效?)。如何与POST发生关系?
API Platform - Invalid value provided (invalid IRI?). How to POST with relations?
我设置了一个非常简单的 Group -> GroupUser -> User
关系(GroupUser 是一个带有附加数据字段的连接 table,Group OneToMany GroupUsers,它有 ManyToOne 组和用户,以及 User 和 OneToMany GroupUser)并失败到 POST 到 API,收到 invalid IRI
错误。对此似乎有一些困惑,我发现了几个 posts (here and here) 但 none 清楚地解决了我最基本的场景(我遵循 API 平台文档并拥有一个需要 api-platform/api-pack
安装的 Symfony4)。
我正在使用 IRI 来关联对象,但是下面的 POST 不起作用(我有一个 ID 为 1 的用户和一个 ID 为 1 的组)并且 returns Invalid value provided (invalid IRI?)
错误:
curl -X POST "http://api.platform.local/group_users" -H "accept: application/ld+json" -H "Content-Type: application/ld+json" -d "{ \"group\": \"/groups/1\", \"user\": \"/users/1\", \"role\": \"member\"}"
这是我的实体:
App/Entity/Group
/**
* @ORM\OneToMany(targetEntity="GroupUser", mappedBy="group")
*/
private $users;
App/Entity/User
/**
* @ORM\OneToMany(targetEntity="GroupUser", mappedBy="user")
*/
private $groups;
App/Entity/Group用户
/**
* @Assert\NotBlank
* @ORM\JoinColumn(
* nullable=false,
* onDelete="CASCADE"
* )
* @ORM\ManyToOne(
* inversedBy="users",
* targetEntity="App\Entity\Group"
* )
*/
private $group;
/**
* @Assert\NotBlank
* @ORM\JoinColumn(
* nullable=false,
* onDelete="CASCADE"
* )
* @ORM\ManyToOne(
* inversedBy="groups",
* targetEntity="App\Entity\User"
* )
*/
private $user;
我一定是遗漏了一些基本的东西,但文档似乎不需要任何其他东西。这个 post 没有帮助,我什至为此向 UserGroup 实体添加了一个 id,最初我只有 user
和 group
作为 table id。
感谢您的帮助,非常感谢。
我终于想通了,其实我犯了两个错误:
我将值传递给 __construct 以在构造时填充 GroupUser。我完全删除了 __construct,这对 API 平台和自动 IRI 创建来说效果不佳。
我在 group_id 和 user_id 上为我的 GroupUser table 使用了复合主键,我放弃了它以支持自己的 ID。
非常简单,这是我添加到 GroupUser 实体的内容:
/**
* @var int
*
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Id
*/
private $id;
并且不要忘记 getter 方法:
public function getId(): ?int
{
return $this->id;
}
我设置了一个非常简单的 Group -> GroupUser -> User
关系(GroupUser 是一个带有附加数据字段的连接 table,Group OneToMany GroupUsers,它有 ManyToOne 组和用户,以及 User 和 OneToMany GroupUser)并失败到 POST 到 API,收到 invalid IRI
错误。对此似乎有一些困惑,我发现了几个 posts (here and here) 但 none 清楚地解决了我最基本的场景(我遵循 API 平台文档并拥有一个需要 api-platform/api-pack
安装的 Symfony4)。
我正在使用 IRI 来关联对象,但是下面的 POST 不起作用(我有一个 ID 为 1 的用户和一个 ID 为 1 的组)并且 returns Invalid value provided (invalid IRI?)
错误:
curl -X POST "http://api.platform.local/group_users" -H "accept: application/ld+json" -H "Content-Type: application/ld+json" -d "{ \"group\": \"/groups/1\", \"user\": \"/users/1\", \"role\": \"member\"}"
这是我的实体:
App/Entity/Group
/**
* @ORM\OneToMany(targetEntity="GroupUser", mappedBy="group")
*/
private $users;
App/Entity/User
/**
* @ORM\OneToMany(targetEntity="GroupUser", mappedBy="user")
*/
private $groups;
App/Entity/Group用户
/**
* @Assert\NotBlank
* @ORM\JoinColumn(
* nullable=false,
* onDelete="CASCADE"
* )
* @ORM\ManyToOne(
* inversedBy="users",
* targetEntity="App\Entity\Group"
* )
*/
private $group;
/**
* @Assert\NotBlank
* @ORM\JoinColumn(
* nullable=false,
* onDelete="CASCADE"
* )
* @ORM\ManyToOne(
* inversedBy="groups",
* targetEntity="App\Entity\User"
* )
*/
private $user;
我一定是遗漏了一些基本的东西,但文档似乎不需要任何其他东西。这个 post 没有帮助,我什至为此向 UserGroup 实体添加了一个 id,最初我只有 user
和 group
作为 table id。
感谢您的帮助,非常感谢。
我终于想通了,其实我犯了两个错误:
我将值传递给 __construct 以在构造时填充 GroupUser。我完全删除了 __construct,这对 API 平台和自动 IRI 创建来说效果不佳。
我在 group_id 和 user_id 上为我的 GroupUser table 使用了复合主键,我放弃了它以支持自己的 ID。
非常简单,这是我添加到 GroupUser 实体的内容:
/**
* @var int
*
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Id
*/
private $id;
并且不要忘记 getter 方法:
public function getId(): ?int
{
return $this->id;
}