我想有一个端点的实体,这是一个学说管理的实体上市。在这个列表端点中,我想要一些不属于实体的属性。正如文档中所述,这应该由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());
}
}
1条答案
按热度按时间llycmphe1#
按照文档的说明,您只需在自定义提供程序中返回一个
ApiPlatform\State\Pagination\PartialPaginatorInterface
或ApiPlatform\State\Pagination\PaginatorInterface
,API-Platform将负责其余的工作。您已经实现了可用对象:ApiPlatform\State\Pagination\ArrayPaginator
ApiPlatform\State\Pagination\TraversablePaginator