Ресурсы не поддерживаются в сериализованных данных. при использовании FOSRestBundle и Paginator

Я настраиваю службу REST для своего веб-сайта с помощью FOSRestBundle и JMSSerializerBundle.

Я создал собственный метод для репозитория сущностей, который возвращает объект Paginator. Этот метод отлично работает, когда я использую его на обычном веб-сайте, но когда я хочу использовать метод с маршрутом REST, возникает эта ошибка (вывод XML или JSON вызывает ту же ошибку):

«Ресурсы не поддерживаются в сериализованных данных».

Я действительно не знаю, где искать, так как ошибка не очень явна для меня.

Вот мой AdsRestController.php:

<?php

namespace MyProject\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations\View;
use FOS\RestBundle\Controller\Annotations\Get;


class AdsRestController extends Controller
{
    /**
     * @View
     * @Get("/ads/list/all/{page}", requirements={"page" = "\id+"}, defaults={"page" = 1})
     */
    public function getAdsListAllAction($page) {

        $theAds = $this->getDoctrine()->getRepository('MyProjectMainBundle:Ads')->getAds($page);

        return $theAds;
    }
}

и мой AdsRepository.php:

<?php

namespace MyProject\MainBundle\Entity;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;

class AdsRepository extends EntityRepository
{

    public function getAds($page=1, $maxPerPage=10)
    {
            $query = $this->createQueryBuilder('a')
                ->orderBy('a.date', $order)
            ;

        $query->getQuery();

        $query
            ->setFirstResult(($page-1) * $maxPerPage)
            ->setMaxResults($maxPerPage)
        ;

        return new Paginator($query, true);
    }
}

Любая помощь будет высоко ценится !

Спасибо.


person Anthony    schedule 08.02.2015    source источник


Ответы (4)


Вы можете использовать iterator_to_array для преобразования итератора вашего пагинатора в массив:

return iterator_to_array($theAds->getIterator());
person Flodeb    schedule 30.05.2016

Преобразуйте результат вручную в массив, используя getAds()->toArray() в вашем контроллере отдыха.

тут уже ответили, воспользуйтесь поиском!

person ToBe    schedule 08.02.2015
comment
Спасибо за ответ. Это то, что я сделал в первую очередь. Но метода toArray() не существует! - person Anthony; 08.02.2015
comment
Я получаю сообщение об ошибке: "Попытка вызвать метод toArray для класса Doctrine\ORM\Tools\Pagination\Paginator" - person Anthony; 08.02.2015
comment
Жаль не тестил. Переберите объект разбиения на страницы и вручную создайте массив. foreach ($paginator as $entry) { $result[] = $entry; } вернуть $результат - person ToBe; 08.02.2015
comment
Да, это работает, конечно. Но разве нет другого — не грязного — решения? Еще раз спасибо за ваш ответ. - person Anthony; 08.02.2015

Ознакомьтесь с методом ->getIterator(), доступным для объектов Paginator. См. https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Pagination/Paginator.php

person ToBe    schedule 08.02.2015

Если вы используете iterator_to_array, он преобразует массив результатов в один объект. Лучше извлекать их в массив, а затем сериализовать.

 $var = [];
        foreach ($records as $rec){
            array_push($var, $rec);
        }

        $res = $this->get('jms_serializer')->serialize($var, 'json');
        return new JsonResponse(json_decode($res));
person Vaibhav Sisodiya    schedule 12.05.2018