将实体绑定到查询参数只允许具有标识符的实体



我正在使用symfony-6,并希望在控制器中有$data参数,以便通过Api-Platform创建对象,它在Api-Platform中给出此错误:

"Binding entities to query parameters only allowed for entities that have an identifier.Class "App\Entity\User" does not have an identifier."

这是我在控制器中的代码,想通过Api-Platform检查代码

class UserController extends AbstractController
{
public function __invoke(User $data): void
{
print $data->getLogin() . PHP_EOL;
print $data->getPassword();
exit();
}
}

既然这个问题缺乏细节,这里是我最好的回答。在Api平台的标准使用中,您不必使用自定义控制器来创建对象。使用Api平台3:

你只需要用方法"POST"来创建相应的对象。

为了做到这一点,你必须声明用户实体为apiresource,并正确设置哪些字段可以使用"Groups"写入。

下面是一个使用Php属性的例子:
#[ORMEntity(repositoryClass: UserRepository::class)]
#[ORMTable(name: '`user`')] // Do not remove ` or it will crash
#[ApiResource(
normalizationContext: ['groups' => ['user:read']],
denormalizationContext: ['groups' => ['write']],
security: "is_granted('ROLE_ADMIN')",
)]
class User 
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
#[ApiProperty(identifier: true)]
#[Groups(['user:read'])]
private ?int $id;
#[ORMColumn(type: 'string', length: 180, unique: true)]
#[Groups(['user:read', 'write'])]
private string $email;
#[ORMColumn(type: 'string', length: 100)]
#[Groups(['user:read', 'write'])]
private string $firstName;
}
如果你使用POST方法调用你的url承认它是 ,那么Api平台就会发挥神奇的作用
/api/users

与负载

{
"email": "johndoe@email.com",
"firstName": "Thomas"
}

你可以在apiresource属性中看到,它声明了组"write"在denormalizationContext。它的字面意思是:when creating or updating this entity i allow property with group write to be written由于$id是自动生成的,因此不需要在write

组中。要获得更精确的答案,请提供该实体的用户实体类和api平台配置。

如果您希望在创建对象时完成其他操作,例如,向用户发送带有邀请链接的电子邮件。看订阅者

https://api-platform.com/docs/core/events/

希望有帮助

相关内容

  • 没有找到相关文章

最新更新