У меня есть модельсериализации массив объектов с использованием Doctrine и JMSSerializer аннотаций
/**
* @ORM\Table(name="polygon")
* @ORM\Entity(repositoryClass="MyBundle\Repository\PolygonRepository")
* @JMS\ExclusionPolicy("none")
*/
class Polygon {
/**
* @var string
*
* @ORM\Column(name="polygon", type="json_array")
* @JMS\Type("array<MyBundle\Model\Point>")
*/
private $points;
/***/
}
в БД хранится как текст "[{ "х": 1, "у": 1} ...]
контроллер у меня
/**
* Matches /polygon exactly
*
* @Route("/", name="polygon_list")
* @Method("GET")
*
* @Rest\Get("/")
*
*/
public function listAction()
{
return $this->container->get('doctrine.orm.entity_manager')
->getRepository('MyBundle:Polygon')
->findAll();
}
так я получаю ReflectionProperty :: GetValue() ожидает параметр 1, чтобы быть объект, массив дал
в ... поставщика/JMS/метаданные/SRC/Метаданные/PropertyMetadata.php: 51
Если бы это было только, чтобы получить результат, она может быть решена с помощью виртуальной собственности
/**
* @JMS\Exclude
*/
private $points;
/**
* @JMS\VirtualProperty
* @JMS\Type("array<MyBundle\Model\Point>")
* @JMS\SerializedName("points")
* @JMS\Groups({"common"})
*
* @return array
*/
public function getMyPoints() {
return [new Point(), new Point()]
}
Но я должно получить эти пункты, как JSON от POST таким образом, единственным способом, которым я нашел до сих пор является доктрина пользовательского типа похож на https://github.com/sonata-project/sonata-doctrine-extensions
с единственной разницей, что в методе convertToPHPValue я нахожусь addind дополнительного приведения типов, чтобы получить объекты вместо массива ДООСА:
// pass my [{"x":1, "y":1} ...]
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return array_map(function($a){ return (object)$a;}, json_decode($value));
}
Есть ли более чистое решение без добавления пользовательской сериализации Doctrine?
если только этого ... Поставщик/JMS/метаданные/SRC/Метаданные/PropertyMetadata.php: 51 был
return $this->reflection->getValue((object)$obj);
но
return $this->reflection->getValue($obj); // :(
если поля doctrine - это json_array, почему вы не пытаетесь сбрасывать как строку для jmsserializer? – Matteo
вы можете найти дискуссию [здесь] (https://github.com/schmittjoh/JMSSerializerBundle/issues/431) об этом – Matteo