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"}) 中理解什么? foob​​argroup 没有在代码库的任何其他地方使用。不在 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