2012-05-24 2 views
1

Я использую рамки Doctrine 2 и Zend с нескольких дней. Я генерирую свои сущности через файлы yaml. Теперь я столкнулся с проблемой конвертации своих объектов Doctrine в Json-формат (чтобы использовать его через AJAX).Doctrine entity to Json using GetSetMethodNormalizer возвращает фатальную ошибку

Вот код используется:

$doctrineobject = $this->entityManager->getRepository('\Entity\MasterProduct')->find($this->_request->id); 
    $serializer = new \Symfony\Component\Serializer\Serializer(array(new Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer()), array('json' => new Symfony\Component\Serializer\Encoder\JsonEncoder())); 

    $reports = $serializer->serialize($doctrineobject, 'json'); 

ниже возвращение я получаю:

Фатальная ошибка: Максимальная функция уровня вложенности '100' достиг, прерывание! в /Users/Sites/library/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php на линии 185

вопрос, кажется, то же самое, чем здесь: http://comments.gmane.org/gmane.comp.php.symfony.symfony2/2659

но не правильное решение, предложенное.

Любая идея, как я могу это сделать?

Приветствия

+0

поэтому в основном, Symfony не поддерживает JSON –

ответ

1

JMSSerializerBundle кажется обрабатывать циклические ссылки отлично.

+0

Спасибо, я посмотрю на него. – bengo

3

Я решил ту же проблему, написав свой собственный GetSetNormalizer мой класс. Определяется статическая переменная в классе для разветвления

class LimitedRecursiveGetSetMethodNormalizer extends GetSetMethodNormalizer 
{ 
public static $limit=2; 
/** 
* {@inheritdoc} 
*/ 
public function normalize($object, $format = null) 
{ 
    $reflectionObject = new \ReflectionObject($object); 
    $reflectionMethods = $reflectionObject->getMethods(\ReflectionMethod::IS_PUBLIC); 

    $attributes = array(); 
    foreach ($reflectionMethods as $method) { 
     if ($this->isGetMethod($method)) { 
      $attributeName = strtolower(substr($method->name, 3)); 
      $attributeValue = $method->invoke($object); 
      if (null !== $attributeValue && !is_scalar($attributeValue) && LimitedRecursiveGetSetMethodNormalizer::$limit>0) { 
       LimitedRecursiveGetSetMethodNormalizer::$limit--; 
       $attributeValue = $this->serializer->normalize($attributeValue, $format); 
       LimitedRecursiveGetSetMethodNormalizer::$limit++; 
      } 

      $attributes[$attributeName] = $attributeValue; 
     } 
    } 

    return $attributes; 
} 

/** 
* Checks if a method's name is get.* and can be called without parameters. 
* 
* @param ReflectionMethod $method the method to check 
* @return Boolean whether the method is a getter. 
*/ 
private function isGetMethod(\ReflectionMethod $method) 
{ 
    return (
     0 === strpos($method->name, 'get') && 
      3 < strlen($method->name) && 
      0 === $method->getNumberOfRequiredParameters() 
    ); 
    } 
} 

И использование

LimitedRecursiveGetSetMethodNormalizer::$limit=3; 
    $serializer = new Serializer(array(new LimitedRecursiveGetSetMethodNormalizer()), array('json' => new 
    JsonEncoder())); 
    $response =new Response($serializer->serialize($YOUR_OBJECT,'json')); 
Смежные вопросы