使用 Doctrine 和 JMSSerializer 注释序列化对象数组
serialize array of objects using Doctrine and JMSSerializer annotations
我有模型
/**
* @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;
/***/
}
在数据库中,它存储为文本 '[{"x":1, "y":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 为对象,数组给定
在...vendor/jms/metadata/src/Metadata/PropertyMetadata.php:51
如果只是为了得到结果,可以用virtual来解决属性
/**
* @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()]
}
但我需要从 POST 收到此点作为 JSON 所以到目前为止我发现的唯一方法是 Doctrine 自定义类型类似于
https://github.com/sonata-project/sonata-doctrine-extensions
唯一不同的是,在 convertToPHPValue 方法中,我添加了额外的类型转换来接收对象而不是 assoc 数组:
// pass my [{"x":1, "y":1} ...]
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return array_map(function($a){ return (object)$a;}, json_decode($value));
}
是否有更干净的解决方案,无需添加自定义 Doctrine 序列化?
如果只有这个
...vendor/jms/metadata/src/Metadata/PropertyMetadata.php:51
有
return $this->reflection->getValue((object)$obj);
但是
return $this->reflection->getValue($obj); // :(
我的问题完全在于使用@JMS\Type
class Polygon {
/**
* @ORM\Column(name="polygon", type="json_array")
*/
private $points;
public function getPoints() { return $this->points;}
public function setPoints($points) {
$this->points = $points;
return $this;
}
/***/
}
工作得很好,感谢@Matteo 指出我把事情复杂化了:)
我有模型
/**
* @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;
/***/
}
在数据库中,它存储为文本 '[{"x":1, "y":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 为对象,数组给定
在...vendor/jms/metadata/src/Metadata/PropertyMetadata.php:51
如果只是为了得到结果,可以用virtual来解决属性
/**
* @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()]
}
但我需要从 POST 收到此点作为 JSON 所以到目前为止我发现的唯一方法是 Doctrine 自定义类型类似于 https://github.com/sonata-project/sonata-doctrine-extensions
唯一不同的是,在 convertToPHPValue 方法中,我添加了额外的类型转换来接收对象而不是 assoc 数组:
// pass my [{"x":1, "y":1} ...]
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return array_map(function($a){ return (object)$a;}, json_decode($value));
}
是否有更干净的解决方案,无需添加自定义 Doctrine 序列化?
如果只有这个 ...vendor/jms/metadata/src/Metadata/PropertyMetadata.php:51 有
return $this->reflection->getValue((object)$obj);
但是
return $this->reflection->getValue($obj); // :(
我的问题完全在于使用@JMS\Type
class Polygon {
/**
* @ORM\Column(name="polygon", type="json_array")
*/
private $points;
public function getPoints() { return $this->points;}
public function setPoints($points) {
$this->points = $points;
return $this;
}
/***/
}
工作得很好,感谢@Matteo 指出我把事情复杂化了:)