2016-11-02 39 views
2

我有一個模型使用教義和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; 

      /***/ 
    } 

在DB它存儲象文本 '[{ 「×」:1, 「y」 的:1} ...]'

在控制器I有

/** 
* 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()] 
} 

但我解決需要從POST收到此點作爲JSON,所以我迄今發現的唯一途徑是相似 https://github.com/sonata-project/sonata-doctrine-extensions

與在convertToPHPValue方法我addind唯一不同的附加強制轉換爲接收對象,而不是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序列化?

如果只有這個 ...供應商/ JMS /元/ src目錄/元/ PropertyMetadata.php:51 有

return $this->reflection->getValue((object)$obj); 

但它

return $this->reflection->getValue($obj); // :(
+0

如果教條領域是一個json_array爲什麼你不試圖轉儲爲字符串爲jmsserializer? – Matteo

+1

你可以在這裏找到關於它的討論(https://github.com/schmittjoh/JMSSerializerBundle/issues/431) – Matteo

回答

0

我的問題是使用@JMS \ Type at

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; 
      } 
      /***/ 
    } 

工作得很好,謝謝s @Matteo爲指出我正在複雜的東西:)

+0

這裏的downvote可能是因爲你發佈了一些僞造的文本,然後在寬限期窗口內編輯。 downvoter可能會注意到並收回他們的downvote,但實際上沒有乾淨的回頭路。我想你所能做的就是注意未來不這樣做。 – tripleee