我有一个自定义操作(在文档中被视为推荐方法),它生成一些逻辑并返回实体的集合。
与常规api平台的动作过滤器完美地工作。但我怎么能得到任何从默认的过滤器来工作与此集合在我的自定义动作?
当我请求GET /cars?createdAt[after]=2018-08-01
或GET /drivers?createdAt[after]=2018-08-01
时,它按预期工作。
但是当我尝试做GET /drivers/42/cars_custom_logic?createdAt[after]=2018-08-01
的时候,它没有过滤任何东西。这是我所期望的,因为我没有在我的自定义操作中调用filter,但是我的问题是-如何添加这个过滤器?
App\Entity\Car
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity
* @ApiResource
* @ApiFilter(DateFilter::class, properties={"createdAt"})
*/
class Car
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @Groups({"car", "driver"})
*/
private $id;
/**
* @ORM\Column(type="datetime")
* @Groups({"car", "driver"})
*/
private $createdAt;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Driver", inversedBy="cars")
* @Groups({"car", "driver"})
*/
private $driver;
public function __construct()
{
$this->createdAt = new \DateTime('now');
}
public function getId(): int
{
return $this->id;
}
public function getCreatedAt(): \DateTimeInterface
{
return $this->createdAt;
}
public function getDriver(): Driver
{
return $this->driver;
}
}
一米四分一秒
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity
* @ApiResource(itemOperations={
* "get",
* "special"={
* "method"="GET",
* "path"="/drivers/{id}/cars_custom_logic",
* "controller"=GetDriverCarsAction::class
* }
* })
* @ApiFilter(DateFilter::class, properties={"createdAt"})
*/
class Driver
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @Groups({"car", "driver"})
*/
private $id;
/**
* @ORM\Column(type="datetime")
* @Groups({"car", "driver"})
*/
private $createdAt;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Car", mappedBy="driver")
* @Groups({"car", "driver"})
*/
private $cars;
public function __construct()
{
$this->createdAt = new \DateTime('now');
}
public function getId(): int
{
return $this->id;
}
public function getCreatedAt(): \DateTimeInterface
{
return $this->createdAt;
}
/**
* @return Collection|Car[]
*/
public function getCars(): Collection
{
return $this->cars;
}
}
App\Controller\GetDriverCarsAction
<?php
namespace App\Controller;
use App\Entity\Car;
use App\Entity\Driver;
use Doctrine\Common\Collections\Collection;
use Symfony\Bridge\Doctrine\RegistryInterface;
final class GetDriverCarsAction
{
private $doctrine;
public function __construct(RegistryInterface $doctrine)
{
$this->doctrine = $doctrine;
}
public function __invoke(Driver $driver): Collection
{
$cars = $driver->getCars();
// ..... Some domain logic .....
// ..... Here – what should i do to make filter work here? .....
return $cars;
}
}
2条答案
按热度按时间siotufzp1#
如果你试着像这样通过yaml添加:
或
要更深入地了解此文档:https://api-platform.com/docs/core/filters#doctrine-orm-filters
希望能有所帮助
7cjasjjr2#
我学习API平台2个星期以来,但我想我已经得到了点digging into the
CollectionProvider
。我需要一个自定义端点,显示购物车元数据(总数、总金额等)并能够使用筛选器(即日期筛选器)。
首先,你的自定义操作应该是一个带有状态提供器的
GetCollection
,或者需要实现一个扩展(空)接口CollectionOperationInterface
的自定义操作类,否则你想通过OpenApiFactory
的检查,而Swagger UI不会在UI中显示过滤器。我知道这感觉不对,在我的例子中,我将返回一个带有统计信息的DTO,而不是一个集合。示例:
现在是提供程序。提供程序应该创建一个查询生成器并注入查询扩展。ORM示例:
如果您需要像原始问题那样的父/子关系,请查看我链接的
CollectionProvider
。