Пагинатор с ApiPlatform в настраиваемом репозитории

Я хотел бы, чтобы в моем ответе были hydra:totalItems и hydra:view, поэтому я выполнил документ https://api-platform.com/docs/core/pagination/#custom-controller-action, но у меня есть эта ошибка " Контроллер должен возвращать "Symfony \ Component \ HttpFoundation \ Ответ ", но он вернул объект типа 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;
    }
}

person Aymeric    schedule 22.11.2019    source источник


Ответы (1)


Решено! Я забыл, что это параметр по умолчанию в аннотации

/**
 * @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);
}

Изменить: я сделал репо, показывающее, как использовать платформу api для необработанных данных (с файлом CSV) и как их фильтровать, сортировать и сохранять разбивку на страницы. https://github.com/aratinau/api-platform-pagination

person Aymeric    schedule 23.11.2019