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

jc3wubiy  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(102)

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

如何保存这些信息?

基于Benjamins回答的解决方案(我不允许在那里编辑):

# 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());
    }
}
58wvjzkj

58wvjzkj1#

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

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

相关问题