我试图了解api过滤器的用途和用法,并且我在网上找到的文档非常稀疏,其中包括“ https://api-platform.com/docs/core/filters”。
据我了解,类型过滤器允许api用户根据给定的策略进行过滤(例如,不检索日期为null的数据),对吗?
在类级别上编写过滤器注释等同于在目标类型的每个属性上编写它,对吧?
我想了解组过滤器,但是没有一个例子。我应该从类注释* @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})
了解什么? foobargroup不在代码库的其他任何地方使用。不在DummyCar.php示例中,也不在其他类中,ang google甚至找不到我一个可行的示例。
我需要的是一种告诉api只返回实体的一部分或另一部分的方法。 groupFilter可以吗?还是仅用于处理1-N关系?
答案 0 :(得分:2)
这些是序列化器过滤器。
如果您拥有
之类的实体<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Serializer\Filter\GroupFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource
* @ApiFilter(PropertyFilter::class)
* @ApiFilter(GroupFilter::class)
*/
class User {
/**
* @Groups({"list"})
*/
public $email;
public $firstname;
public $lastname;
/**
* @Groups({"list"})
*/
public $age;
}
在向GET
发送/users
请求时,例如JSON-LD中的集合应该看起来像
{
...
"hydra:members": [
{
"@id": ...,
"@type": ...,
"email": "john-email@dre.ss",
"firstname": "John",
"lastname": "Doe",
"age": 30
},
{
"@id": ...,
"@type": ...,
"email": "jane-email@dre.ss",
"firstname": "Jane",
"lastname": "Doe",
"age": 20
}
]
...
}
在使用属性过滤器时,向GET
发送/users?properties[]=email&properties[]=firstname
请求,集合看起来像
{
...
"hydra:members": [
{
"@id": ...,
"@type": ...,
"email": "john-email@dre.ss",
"firstname": "John"
},
{
"@id": ...,
"@type": ...,
"email": "jane-email@dre.ss",
"firstname": "Jane"
}
]
...
}
在使用组过滤器时,向GET
发送/users?groups[]=list
请求,集合看起来像
{
...
"hydra:members": [
{
"@id": ...,
"@type": ...,
"email": "john-email@dre.ss",
"age": 30
},
{
"@id": ...,
"@type": ...,
"email": "jane-email@dre.ss",
"age": 20
}
]
...
}
我希望它有助于理解。
在类级别编写过滤器注释等效于 把它写在目标类型的每个属性上,对吗?
对于ORM过滤器,而不是序列化器过滤器,这是正确的
最后,使用@ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})
可以让您更改查询参数属性,例如,如果您拥有一个名为“ groups
”的“真实”属性。然后,您无需发送GET
请求到/users?groups[]=list
,而是发送/users?foobargroups[]=list