ApiFilter 和 GroupFilter 的目的和用法
ApiFilter and GroupFilter purpose and usage
我试图掌握 api 过滤器的用途和用法,我在网上找到的文档非常稀疏,包括“https://api-platform.com/docs/core/filters”。
据我了解,类型过滤器允许 api 用户根据给定策略进行过滤(例如,不检索日期为空的数据) ,对吧?
在 class 级别上编写过滤器注释相当于在目标类型的每个 属性 上编写它,对吗?
我想了解组过滤器,但没有一个例子。我应该从 class 注释 * @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})
中理解什么? foobargroup 没有在代码库的任何其他地方使用。不在 DummyCar.php 示例中,也不在另一个 class 中,ang google 甚至没有找到我的工作示例。
我需要的是一种方法来告诉 api 到 return 实体的一部分或另一部分。 groupFilter 会做吗?还是只用来处理1-N的关系?
那些是序列化过滤器。
如果你有像
这样的实体
<?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;
}
当向 /users
发送 GET
请求时,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
}
]
...
}
希望对理解有所帮助
Writing a filter annotation on the class level is equivalent to
writing it on every property of the targetted type, right?
这适用于 ORM 过滤器,不适用于序列化器过滤器
最后,使用 @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})
允许您更改查询参数 属性,例如您有一个名为 groups
的 "real" 属性。然后,不是将 GET
请求发送到 /users?groups[]=list
,而是发送 /users?foobargroups[]=list
我试图掌握 api 过滤器的用途和用法,我在网上找到的文档非常稀疏,包括“https://api-platform.com/docs/core/filters”。
据我了解,类型过滤器允许 api 用户根据给定策略进行过滤(例如,不检索日期为空的数据) ,对吧?
在 class 级别上编写过滤器注释相当于在目标类型的每个 属性 上编写它,对吗?
我想了解组过滤器,但没有一个例子。我应该从 class 注释 * @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})
中理解什么? foobargroup 没有在代码库的任何其他地方使用。不在 DummyCar.php 示例中,也不在另一个 class 中,ang google 甚至没有找到我的工作示例。
我需要的是一种方法来告诉 api 到 return 实体的一部分或另一部分。 groupFilter 会做吗?还是只用来处理1-N的关系?
那些是序列化过滤器。
如果你有像
这样的实体<?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;
}
当向 /users
发送 GET
请求时,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
}
]
...
}
希望对理解有所帮助
Writing a filter annotation on the class level is equivalent to writing it on every property of the targetted type, right?
这适用于 ORM 过滤器,不适用于序列化器过滤器
最后,使用 @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})
允许您更改查询参数 属性,例如您有一个名为 groups
的 "real" 属性。然后,不是将 GET
请求发送到 /users?groups[]=list
,而是发送 /users?foobargroups[]=list