如何在API Platform中为同一实体配置多个不同的GET子路由
实现方案
完全可以实现,核心通过API Platform的自定义条目操作搭配拆分序列化分组即可完成,操作步骤如下:
步骤1:拆分序列化分组
你需要把原来统一的user:read分组拆分为三个对应业务场景的分组,给对应字段绑定专属序列化组:
// ... 其他类引入代码不变 class User implements UserInterface, PasswordAuthenticatedUserInterface { private int $id; #[Groups(['user:read:data'])] private string $email; #[Groups(['user:read:data'])] private string $firstname; #[Groups(['user:read:data'])] private string $lastname; #[Groups(['user:read:foo'])] private Collection $foo; #[ApiProperty(iri: 'http://schema.org/image')] #[Groups(['user:read:pictures'])] private ?MediaObject $picture1; #[ApiProperty(iri: 'http://schema.org/image')] #[Groups(['user:read:pictures'])] private ?MediaObject $picture2; }
如果需要保留原来的/api/users/{id}接口,对应字段可以同时保留原来的user:read分组即可。
步骤2:添加自定义条目操作
修改#[ApiResource]注解的itemOperations配置,新增三个自定义GET操作,分别指定路径和对应的序列化组。默认不需要自定义控制器,API Platform会自动复用原有条目查询逻辑,仅通过序列化组控制返回字段:
#[ApiResource( itemOperations: [ // 原来的默认get操作可按需保留或删除 'get' => [ 'normalization_context' => ['groups' => ['user:read']], ], // 新增三个自定义接口 'get_data' => [ 'method' => 'GET', 'path' => '/users/{id}/data', 'normalization_context' => ['groups' => ['user:read:data']], // 按需添加权限控制,比如仅允许用户访问自己的数据 // 'security' => "is_granted('ROLE_USER') and object == user", ], 'get_foo' => [ 'method' => 'GET', 'path' => '/users/{id}/foo', 'normalization_context' => ['groups' => ['user:read:foo']], ], 'get_pictures' => [ 'method' => 'GET', 'path' => '/users/{id}/pictures', 'normalization_context' => ['groups' => ['user:read:pictures']], ] ], )] class User implements UserInterface, PasswordAuthenticatedUserInterface { // ... 实体属性代码不变 }
步骤3:验证生效
清理Symfony缓存后,访问API文档(默认路径为/api/docs)即可看到新增的三个接口,调用对应路径会仅返回对应分组的字段。
内容的提问来源于stack exchange,提问作者Fabien Delmotte
相关产品推荐
相关产品推荐

