ApiFilter和GroupFilter的用途和用法

时间:2018-10-24 10:13:54

标签: api-platform.com

我试图了解api过滤器的用途和用法,并且我在网上找到的文档非常稀疏,其中包括“ https://api-platform.com/docs/core/filters”。

据我了解,类型过滤器允许api用户根据给定的策略进行过滤(例如,不检索日期为null的数据),对吗?

在类级别上编写过滤器注释等同于在目标类型的每个属性上编写它,对吧?

我想了解组过滤器,但是没有一个例子。我应该从类注释* @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})了解什么? foob​​argroup不在代码库的其他任何地方使用。不在DummyCar.php示例中,也不在其他类中,ang google甚至找不到我一个可行的示例。

我需要的是一种告诉api只返回实体的一部分或另一部分的方法。 groupFilter可以吗?还是仅用于处理1-N关系?

1 个答案:

答案 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