symfony 如何在api-platform 3中对GetCollection操作的元素使用DTO,而不会丢失基于原则查询的分页信息

c7rzv4ha  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(78)

我想有一个端点的实体,这是一个学说管理的实体上市。在这个列表端点中,我想要一些不属于实体的属性。正如文档中所述,这应该由DTO表示,我可以修改表示。对于单个实体GET操作,这很好地工作。
对于GetCollection操作,我需要一个提供程序,以便示例化dto。为了维护原则过滤器和分页逻辑,我复制了默认的原则提供程序(ApiPlatform\Doctrine\Orm\State\CollectionProvider)
在这个提供程序中,我得到了一个ApiPlatform\Doctrine\Orm\Paginator对象。我可以迭代并构建DTO的结果集(数组)并返回它,但是这样我就在序列化输出中丢失了分页信息。

如何保存这些信息?

一个基于本杰明回答的解决方案(我不允许在那里编辑):

# reuse doctrine collection provider
App\State\EntityProvider:
    bind:
        $collectionProvider: '@api_platform.doctrine.orm.state.collection_provider'
------
EntityProvider implements ProviderInterface {
    public function __construct(
        readonly private ProviderInterface $collectionProvider, readonly private ResourceMetadataCollectionFactoryInterface $collectionFactory){}
        
    public function provide(...)
        $collection = $this->collectionFactory->create...
        $paginator = $this->collectionProvider->provide($collection, $uriVariables, $context);
        
        #rewrite resultset
        $results_new = []; 
        foreach($paginator as $result ) {
            $results_new[] = ...}
            
        return new TraversablePaginator(new \ArrayObject($results_new), $paginator->getCurrentPage(), $paginator->getItemsPerPage(), $paginator->getTotalItems());
    }
}
llycmphe

llycmphe1#

按照文档的说明,您只需在自定义提供程序中返回一个ApiPlatform\State\Pagination\PartialPaginatorInterfaceApiPlatform\State\Pagination\PaginatorInterface,API-Platform将负责其余的工作。您已经实现了可用对象:

  • ApiPlatform\State\Pagination\ArrayPaginator
  • ApiPlatform\State\Pagination\TraversablePaginator

相关问题