在 API Platform 3 中,我有一个名为 Report 的 PHP 实体。 我想提供两种检索集合的方法:
/reports: the standard URI generated by API Platform.
/admin/reports: an additional URI with a specific normalizationContext.
但是,当我实现这段代码时,我只能获得一个集合,而不是两者都获得。
<?php
...
#[ORM\Entity(repositoryClass: ReportRepository::class)]
#[ApiResource(
uriTemplate: '/admin/reports{._format}',
operations: [
new GetCollection(security: "is_granted('ROLE_ADMIN')"),
new Get(security: "is_granted('ROLE_ADMIN')"),
new Patch(security: "is_granted('ROLE_ADMIN')"),
],
normalizationContext: [
AbstractNormalizer::GROUPS => ['Report:read:admin'],
],
denormalizationContext: [
AbstractNormalizer::GROUPS => ['Report:write:admin'],
],
order: ['createdAt' => 'DESC']
)]
#[ApiResource(
operations: [
new GetCollection(),
new Post(),
new Get(
security: 'object.getCreatedBy() == user',
controller: NotFoundAction::class,
read: false,
output: false
)
],
normalizationContext: [
AbstractNormalizer::GROUPS => ['Report:read'],
],
denormalizationContext: [
AbstractNormalizer::GROUPS => ['Report:write'],
],
order: ['createdAt' => 'DESC']
)]
class Report
{
...
要在 API Platform 3 中实现多个集合 URI,关键在于正确配置资源,以允许 /reports 和 /admin/reports 集合与不同的规范化上下文共存。
在您当前的设置中,问题在于您在同一个类上定义了两个 #[ApiResource] 属性,API Platform 将其解释为冲突的配置。要解决此问题,您需要在单个 #[ApiResource] 声明中使用自定义操作定义不同的 URI。
我能理解的..,如果我假设错误,请随时纠正我,并解释。