Api平台:过滤器标准化上下文组

时间:2018-06-20 07:29:57

标签: php rest symfony symfony4 api-platform.com

大家好,我刚开始使用Api-Platform,这个问题困扰了我几个小时。

我有一个Symfony4项目和两个实体:Bill&Abo

账单:

/**
 * @ORM\Entity(repositoryClass="App\Repository\BillRepository")
 * @ApiResource(attributes={
 *   "normalization_context"={"groups"={"bill-abo"}}
 * })
 */
class Bill {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="date", nullable=false)
     * @Groups("bill-abo")
     */
    private $date;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Abo", inversedBy="bills")
     * @ORM\JoinColumn
     * @ApiSubresource
     * @Groups("bill-abo")
     */
    private $abo;
}

Abo:

/**
 * @ORM\Entity(repositoryClass="App\Repository\AboRepository")
 * @ApiResource
 */
class Abo
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50, nullable=false)
     */
    private $name;

    /**
     * @var integer
     *
     * @ORM\Column(name="price", type="integer", nullable=false)
     * @Groups("bill-abo")
     */
    private $price;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Bill", mappedBy="abo")
     */
    private $bills;
}

当我现在将此网址称为/api/bills时,我会得到以下数据:

{
  "date": "2018-03-14T00:00:00+00:00",
  "abo": {
    "price": 960
  }
},
...

我现在的目标是调用一个类似于以下内容的网址:/api/bills?abo以得到上面的结果,而当我调用/api/bills时,我只想要帐单数据(不包含abo数据),就像这样:

{
  "id": 14,
  "date": "2018-03-08T00:00:00+00:00",
  "abo": "/api/abos/1"
},
...

我阅读了文档,特别是有关Group FilterProperty Filter的部分,但我想不出解决方案。

这是否有可能,如果可以,我该如何实现?

感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:1)

您可以利用组过滤器。

  1. Bill这样的@ApiFilter(GroupFilter::class, arguments={"overrideDefaultGroups": true, "whitelist": {"foo"}})资源类上添加GroupFilter
  2. Bill::$abo属性添加一个新的名为“ foo”的额外组(不要添加至Abo类中的任何属性)
  3. 尝试/bills?groups[]=foo