我想创建一个路由,它将返回我的一个实体的列表,其中只有一些字段。
我认为这可以通过序列化组来实现,但这可能不是最简单的方法。
因此,我认为只需添加一个名为special_get
的新自定义路由,以使用normalization_group
user:special
进行测试,如下所示:
/**
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={"user:read", "user:list", "user:special"}},
* "denormalization_context"={"groups"={"user:write"}},
* "order"={"availabilities.start": "ASC"}
* },
* collectionOperations={
* "get"={
* "mehtod"="GET",
* "security"="is_granted('ROLE_USER')",
* "normalization_context"={"groups"={"user:list"}},
* },
* "special_get"={
* "method"="GET",
* "path"="/user/specialroute",
* "normalization_context"={"groups"={"user:special"}}
* },
* }
* )
* @ORM\Entity(repositoryClass=UserRepository::class)
*/
并且只将这个group
应用于我想返回的几个字段:
/**
* @ORM\Column(type="boolean")
* @Groups({"user:read", "user:list", "user:write", "user:special"})
*/
private $firstName;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"user:write", "user:read", "user:list", "user:special"})
*/
private $photo;
/**
* @ORM\OneToMany(targetEntity=Availability::class, mappedBy="entityname", cascade={"remove"})
* @Groups({"user:read", "user:list", "user:write"})
* @ApiSubresource()
*/
private $availabilities;
这确实在swagger界面上创建了一个新的路由,但我得到的500
显示:
An error occured
Cannot select distinct identifiers from query with LIMIT and ORDER BY on a column from a fetch joined to-many association. Use output walkers.*
有人知道这个错误可能来自哪里吗?
或者是否有更好的方法来实现在一条特殊路线上从一个实体中只恢复几个字段?
谢谢你!
2条答案
按热度按时间qjp7pelc1#
因此,关于错误消息,您的问题出在
order
属性中,该属性按availabilities.start
属性对结果进行排序,但未添加到规范化组中。所以你得在这里道:
availabilities
属性添加到规范化组据我所知,api平台目前还不支持对每个操作的属性进行排序,似乎不应该。
6uxekuva2#
您可以使用PropertyFilter来选择特定字段
启用过滤器:
导入类
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
现在您可以使用下列查询来筛选序列化属性: