使用GetSetMethodNormalizer将条令实体转换为Json返回致命错误
几天后,我开始使用Doctrine 2和Zend框架。 我正在跨yaml文件生成实体。 现在我遇到了一个问题,就是如何将我的实体理论转换为Json格式(以便通过AJAX使用它) 以下是使用的代码:使用GetSetMethodNormalizer将条令实体转换为Json返回致命错误,json,doctrine-orm,entity,Json,Doctrine Orm,Entity,几天后,我开始使用Doctrine 2和Zend框架。 我正在跨yaml文件生成实体。 现在我遇到了一个问题,就是如何将我的实体理论转换为Json格式(以便通过AJAX使用它) 以下是使用的代码: $doctrineobject = $this->entityManager->getRepository('\Entity\MasterProduct')->find($this->_request->id); $serializer = new \Sy
$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”,正在中止!在第185行的/Users/Sites/library/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php中
问题似乎与这里相同:
但没有提出适当的解决办法
知道我该怎么做吗
Cheers似乎可以很好地处理循环引用。我通过在类中编写自己的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()
);
}
}
谢谢,我会看一下。所以基本上,Symfony不支持JSON
LimitedRecursiveGetSetMethodNormalizer::$limit=3;
$serializer = new Serializer(array(new LimitedRecursiveGetSetMethodNormalizer()), array('json' => new
JsonEncoder()));
$response =new Response($serializer->serialize($YOUR_OBJECT,'json'));