Служба JMS_Serializer не работает в Symfony2 - Ошибка: допустимый размер памяти

В моем контроллере в Symfony2 я получаю коллекцию сообщений в блогах как объекты Doctrine:

$posts = $this->getDoctrine()
        ->getRepository('MyBundle:Post')
        ->findPostDatesAscending();

Я послушно установил пакет JMSSerializer, поскольку он должен работать с Doctrine ORM, и вызвал службу также в своем контроллере:

$serializer = $this->container->get('jms_serializer'); 
$jsonContent = $serializer->serialize($posts, 'json');
echo $jsonContent;

Однако я получаю следующую ошибку:

FatalErrorException: Ошибка: допустимый размер памяти 134217728 байт исчерпан (попытался выделить 55204 байта) в C: \ wamp \ www \ Symfony \ vendor \ jms \ serializer \ src \ JMS \ Serializer \ GenericSerializationVisitor.php, строка 58

Я уже пытался найти эту проблему, и, похоже, не так много радости в том, чтобы заставить работать сериализацию Entities в JSON. Я уверен, что это какая-то проблема с рекурсией, но я новичок в Symfony2, поэтому я не уверен в причинах, по которым это так, и, в частности, как я могу получить эти Entities / Objects в строку JSON.

Чуть не забыл, что у моего объекта post есть отношение oneToMany. Не уверен, актуально ли это:

/BlogBundle/Resources/config/doctrine/Blog.orm.yml
MyBundle\BlogBundle\Entity\Blog:
type: entity
repositoryClass: MyBundle\BlogBundle\Entity\BlogRepository
oneToMany:
    posts:
        targetEntity: Post
        mappedBy: blog
table: null
fields:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
    blog:
        type: string
        length: '255'
uniqueConstraints:
    search_idx:
        columns: blog
lifecycleCallbacks: {  }

И мой объект блога также сопоставляется с объектом автора - типичный блог, настроенный на самом деле ...

РЕДАКТИРОВАТЬ: В ответ на @kix я добавил код исключения ко ВСЕМ моим классам сущностей (сообщение, см. Пример кода ниже, блог и автор), который исключил все объекты, которые должны быть сериализованы, и ВСЕ ЕЩЕ получил ошибку памяти. Я ограничил ответ только одним сообщением в блоге, которое связано только с блогом (идентификатор и имя) и автором (идентификатор и имя).

namespace MyBundle\BlogBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;

/**
 * The following annotations tells the serializer to skip all properties which
 * have not marked with @Expose.
 *
 * @ExclusionPolicy("all")
 */

/**
 * Post
 */
class Post
{
     /**
      * @var integer
      */
      private $id;
      ...etc

Любая помощь будет оценена по достоинству, спасибо.


person colincclark    schedule 20.05.2014    source источник


Ответы (3)


Вам следует попробовать использовать стратегии исключения JMS Serializer, чтобы указать, какие свойства следует сериализовать, а какие не должно быть.

Я полагаю, у вашего объекта есть некоторые вложенные свойства, которые делают сериализацию слишком сложной (возможно, он извлекает блоги сообщения, а затем пытается сериализовать другие сообщения этого блога и т. Д.).

person kix    schedule 20.05.2014
comment
Я добавил код исключения ко ВСЕМ моим классам сущностей, который исключил все объекты, которые нужно сериализовать, и ВСЕ ЕЩЕ получил ошибку памяти. Я ограничил ответ только одним сообщением в блоге, которое связано только с блогом (идентификатор и имя) и автором (идентификатор и имя). Я не уверен, что еще делать, есть идеи? - person colincclark; 21.05.2014

Что произойдет, если вы просто:

    $posts = $this->getDoctrine()->getRepository('MyBundle:Post')->findPostDatesAscending();
    return array('posts' => $posts);

Пытался прокомментировать, но репутации нет.

person Community    schedule 18.06.2014

В вашем репозитории сделайте оператор select только для нужных. Избегайте включения внешних ключей, полей отношений. Рабочий пример

public function getAllVotersDesc()
{
    //return $this->findBy(array(), array('id' => 'DESC'));
    return $this
        ->createQueryBuilder('v')
        ->select('v.firstname','lastname')
       // ->where('v.dateCreated <= :now')->setParameter('now', new \DateTime())
        ->orderBy('v.dateCreated', 'DESC')
       // ->setMaxResults(10)
        ->getQuery()
        ->getResult()
    ;
}
person Community    schedule 24.11.2015