自定义存储库上带有 ApiPlatform 的分页器
Paginator with ApiPlatform on custom repository
我想在我的回复中包含 hydra:totalItems
和 hydra:view
,所以我遵循了文档 https://api-platform.com/docs/core/pagination/#custom-controller-action 但我遇到了这个错误
"The controller must return a "Symfony\Component\HttpFoundation\Response" 对象,但它返回类型为 ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator 的对象。"
<?php
namespace App\Controller;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator;
use App\Repository\ProductRepository;
use App\Repository\TermRelationshipsRepository;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class FakeAction extends AbstractController
{
private $termRelationshipsRepository;
public function __construct(TermRelationshipsRepository $termRelationshipsRepository)
{
$this->termRelationshipsRepository = $termRelationshipsRepository;
}
/**
* @Route(
* name="api_fake_action",
* path="/api/fake"
* )
*/
public function __invoke(): Paginator
{
return $this->termRelationshipsRepository->findAllProductsIdsByTerm_id(126);
}
}
<?php
namespace App\Repository;
use App\Entity\TermRelationships;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator;
use Symfony\Bridge\Doctrine\RegistryInterface;
/**
* @method TermRelationships|null find($id, $lockMode = null, $lockVersion = null)
* @method TermRelationships|null findOneBy(array $criteria, array $orderBy = null)
* @method TermRelationships[] findAll()
* @method TermRelationships[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class TermRelationshipsRepository extends ServiceEntityRepository
{
const ITEMS_PER_PAGE = 5;
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, TermRelationships::class);
}
public function findAllProductsIdsByTerm_id($term_id, $array_result = false, $offset = 1, $nb_result = 23) : Paginator
{
$firstResult = (1 - $offset) * self::ITEMS_PER_PAGE;
$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder
->andWhere('p.termTaxonomyId = :termTaxonomyId')
->setParameter('termTaxonomyId', $term_id)
;
$criteria = Criteria::create()
->setFirstResult($firstResult)
->setMaxResults(self::ITEMS_PER_PAGE);
$queryBuilder->addCriteria($criteria);
$doctrinePaginator = new DoctrinePaginator($queryBuilder);
$paginator = new Paginator($doctrinePaginator);
return $paginator;
}
}
已解决!
我忘了它是注释中的默认参数
/**
* @Route(
* name="api_fake_action",
* path="/api/fake",
* defaults={
* "_api_resource_class"=FakeEntity::class,
* "_api_collection_operation_name"="post_publication"
* }
* )
*/
public function __invoke(): Paginator
{
return $this->termRelationshipsRepository->findAllProductsIdsByTerm_id(126);
}
编辑:我制作了一个 repo,展示了如何在原始数据(使用 csv 文件)上使用 api 平台以及如何对其进行过滤、排序和保持分页.
https://github.com/aratinau/api-platform-pagination
我想在我的回复中包含 hydra:totalItems
和 hydra:view
,所以我遵循了文档 https://api-platform.com/docs/core/pagination/#custom-controller-action 但我遇到了这个错误
"The controller must return a "Symfony\Component\HttpFoundation\Response" 对象,但它返回类型为 ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator 的对象。"
<?php
namespace App\Controller;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator;
use App\Repository\ProductRepository;
use App\Repository\TermRelationshipsRepository;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class FakeAction extends AbstractController
{
private $termRelationshipsRepository;
public function __construct(TermRelationshipsRepository $termRelationshipsRepository)
{
$this->termRelationshipsRepository = $termRelationshipsRepository;
}
/**
* @Route(
* name="api_fake_action",
* path="/api/fake"
* )
*/
public function __invoke(): Paginator
{
return $this->termRelationshipsRepository->findAllProductsIdsByTerm_id(126);
}
}
<?php
namespace App\Repository;
use App\Entity\TermRelationships;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator;
use Symfony\Bridge\Doctrine\RegistryInterface;
/**
* @method TermRelationships|null find($id, $lockMode = null, $lockVersion = null)
* @method TermRelationships|null findOneBy(array $criteria, array $orderBy = null)
* @method TermRelationships[] findAll()
* @method TermRelationships[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class TermRelationshipsRepository extends ServiceEntityRepository
{
const ITEMS_PER_PAGE = 5;
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, TermRelationships::class);
}
public function findAllProductsIdsByTerm_id($term_id, $array_result = false, $offset = 1, $nb_result = 23) : Paginator
{
$firstResult = (1 - $offset) * self::ITEMS_PER_PAGE;
$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder
->andWhere('p.termTaxonomyId = :termTaxonomyId')
->setParameter('termTaxonomyId', $term_id)
;
$criteria = Criteria::create()
->setFirstResult($firstResult)
->setMaxResults(self::ITEMS_PER_PAGE);
$queryBuilder->addCriteria($criteria);
$doctrinePaginator = new DoctrinePaginator($queryBuilder);
$paginator = new Paginator($doctrinePaginator);
return $paginator;
}
}
已解决! 我忘了它是注释中的默认参数
/**
* @Route(
* name="api_fake_action",
* path="/api/fake",
* defaults={
* "_api_resource_class"=FakeEntity::class,
* "_api_collection_operation_name"="post_publication"
* }
* )
*/
public function __invoke(): Paginator
{
return $this->termRelationshipsRepository->findAllProductsIdsByTerm_id(126);
}
编辑:我制作了一个 repo,展示了如何在原始数据(使用 csv 文件)上使用 api 平台以及如何对其进行过滤、排序和保持分页. https://github.com/aratinau/api-platform-pagination